'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,Если строка, представляющая шестнадцатеричное число, используется в контексте целого числа / числа с плавающей запятой:
'0xD' * 1
В этом выражении строка '0xD'
будет оценена как число из-за оператора *
и 1
Операнд (см. Тип Жонглирование ).Это не приведение типа , потому что нет конструкции языка преобразования.
Похоже, что в случае этого выражения интерпретация строки как целого числа выполняется буквально (как указано), но не то же самое, что и при выполнении преобразования.
Можно утверждать, что оно остается недокументированным, когда применяется преобразование и когда применяется буквальная интерпретация.Однако использование приведения типов может обойти вас при любых таких проблемах ( Demo ):
<?php
$value = '0xD';
var_dump($value); # string(3) "0xD"
var_dump($value * 1); # int(13)
var_dump((int) $value * 1); # int(0)