приведение строки к int - PullRequest
       2

приведение строки к int

14 голосов
/ 06 августа 2011

Мой код

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

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

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 06 августа 2011

'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)
2 голосов
/ 06 августа 2011

Это цитаты, очевидно.

<?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 не видит шестнадцатеричные значения в строках как возможные целые числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...