Ответ 1
'0xD'
- строка. Документация четко указывает, как строка "отливается" в целочисленное значение (выбор здесь (int) '0xD';
):
Когда строка оценивается в числовом контексте, результирующее значение и тип определяются следующим образом.
Если строка не содержит символов ".", "e" или "E", а числовое значение вписывается в ограничения типа целочисленного типа (как определено в PHP_INT_MAX), строка будет оцениваться как целое число. Во всех остальных случаях он будет оцениваться как float.
Значение задается начальной частью строки. Если строка начинается с действительных числовых данных, это будет используемое значение. В противном случае значение будет равно 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
(см. Тип Juggling). Это не 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)