Intereting Posts
PHP setlocale () не работает для проверки ctype_alpha Новичок имеет проблемы с загрузкой файла с помощью ASIHTTPRequest Вытягивание JSON через AJAX для заполнения Drop-Down Почему вы не можете называть абстрактные функции абстрактными классами в PHP? Можно ли использовать массив без его инициализации? Удалить дубликаты данных в текстовом файле с помощью php Вызов пользовательских функций в PHP eval () Как использовать memcache с php Отправка данных POST на Android Как динамически заполнять параметры в выпадающих списках на основе выбора в другом раскрывающемся списке? как настроить URL-адрес в yii framework автоматически Динамические страницы PHP с пользовательской ссылкой Изображение от RGB до Cmyk в php Как я могу исправить флеш-флагом PHP-потокобезопасное / непоточное безопасное рассогласование? Инструмент для добавления и завершения документации исходного кода PHP

литье строки в int

Мой код

<?php var_dump('0xD' * 1 ); var_dump((int)'0xD'); var_dump(intval('0xD')); var_dump((float)'0xD'); 

Фактический результат:

 int(13) int(0) int(0) float(0) 

Почему результат первых двух условий не одинаковый? Можете ли вы предоставить мне правильную документацию?

Все, что я нашел, это

  • Type Casting : Type casting в PHP работает так же, как и в C: имя нужного типа записывается в круглых скобках перед переменной, которая должна быть выбрана. Возможно, не совсем очевидно, что произойдет при кастинге между определенными типами. Для получения дополнительной информации см. Следующие разделы: …
  • Преобразование в целое число : из строк: см. Преобразование строк в числа
  • Преобразование строк в числа Когда строка оценивается в числовом контексте, результирующее значение и тип определяются следующим образом.

Итак, насколько я понимаю, docs говорят, что приведение в int напрямую и путем ввода числового контекста должно быть одинаковым. Какая у меня ошибка?

ДОБАВЛЕН : Перед ответом попробуйте проверить первый и второй код (и выходы).

'0xD' – строка. В документации четко указано, как строка «отливается» в целочисленное значение (выбор (int) '0xD'; пример здесь):

Когда строка оценивается в числовом контексте, результирующее значение и тип определяются следующим образом.

Если строка не содержит символов «.», «E» или «E», а числовое значение вписывается в ограничения типа целочисленного типа (как определено PHP_INT_MAX), строка будет оцениваться как целое число. Во всех остальных случаях он будет оцениваться как плавающий.

Значение задается начальной частью строки. Если строка начинается с действительных числовых данных, это будет используемое значение. В противном случае значение будет равно 0 (ноль). Действительные числовые данные являются необязательным знаком, за которым следуют одна или несколько цифр (необязательно содержащие десятичную точку), за которыми следует необязательный показатель. Показателем является «e» или «E», за которым следует одна или несколько цифр.

Начальная позиция строки '0xD' которая является числом, равна 0 , следовательно, это (int) 0 .

Не смешивайте это с написанием кода. Если вы пишете это в коде, это не строка, это шестнадцатеричное представление / обозначение целого числа ( Demo ):

 <?php $value = eval("return 0xD;"); var_dump($value); # int(13) 

Это не полностью отвечает, почему выражение '0xD' * 1 приводит к (int) 13 , но объясняет все остальное до сих пор и какие два правила интерпретации целочисленного значения применяются в PHP.

Я предполагаю, что существует небольшая разница между литейным целым и целым контекстом в PHP. Если строка, представляющая шестнадцатеричное число, используется в контексте integer / float:

 '0xD' * 1 

В этом выражении строка '0xD' будет оцениваться как число из-за оператора * и 1 операнда (см. Тип Жонглирование ). Это не Type Casting , потому что нет конструкции языка литья.

Похоже, что в этом выражении интерпретация строки как целого выполняется буквально (как указано), но не такая, как при конверсии.

Можно утверждать, что он остается недокументированным, когда применяется конверсия, и когда применяется буквальное толкование. Однако использование типа casting может помочь вам в решении любых таких проблем ( Demo ):

 <?php $value = '0xD'; var_dump($value); # string(3) "0xD" var_dump($value * 1); # int(13) var_dump((int) $value * 1); # int(0) 

Это кавычки.

 <?php var_dump('0xD' * 1 ); var_dump((int) 0xD); var_dump(intval(0xD)); var_dump((float) 0xD); 

дает

 int(13) int(13) int(13) float(13) 

Я думаю, что PHP не видит шестнадцатеричных значений в строках как возможно ints.