Мой код
<?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)
Почему результат первых двух условий не одинаковый? Можете ли вы предоставить мне правильную документацию?
Все, что я нашел, это
Итак, насколько я понимаю, 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.