Подтвердить что ты не робот

Литье строки в 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)

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

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

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

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

ADDED: попробуйте проверить первый и второй код (и выходы) перед ответом.

4b9b3361

Ответ 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)

Ответ 2

Это кавычки, apparantly.

<?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.