Почему PHP преобразует строку в целое число?

#php #string #comparison #integer

#php #строка #сравнение #целое

Вопрос:

Я хотел бы знать, при каком условии PHP решает, когда преобразовывать из строки в целое число и наоборот

Пример:

 $key = 0;
$test = 'teststring';
if($key == $test) {
    echo "Why, tell me why!";
}
else {
    echo "That's the way love goes...";
}
  

Я знаю, что должен использовать ‘===’ для получения лучших результатов, но мне любопытно узнать, почему PHP решает преобразовать строку в целое число, а не наоборот.

Комментарии:

1. Прочитайте это: php.net/manual/en/language.types.type-juggling.php

Ответ №1:

Из руководства по PHP:

тип переменной определяется контекстом, в котором используется переменная. То есть, если переменной $var присваивается строковое значение, $ var становится строкой. Если целочисленное значение затем присваивается $var, оно становится целым числом.

Подробности см. в разделе Манипулирование типами и таблица сравнения типов и преобразование строк в числа:

Если строка не содержит ни одного из символов ‘.’, ‘e’ или ‘E’ и числовое значение вписывается в пределы целочисленного типа (как определено PHP_INT_MAX), строка будет вычислена как целое число. Во всех остальных случаях оно будет оцениваться как значение с плавающей точкой.

Значение задается начальной частью строки. Если строка начинается с допустимых числовых данных, это будет используемое значение. В противном случае значение будет равно 0 (нулю). Допустимые числовые данные — это необязательный знак, за которым следует одна или несколько цифр (необязательно содержащих десятичную точку), за которыми следует необязательный показатель степени. Показатель степени — это ‘e’ или ‘E’, за которым следует одна или более цифр.

И глава о строках:

Целое число или число с плавающей точкой преобразуется в строку, представляющую число текстуально (включая часть экспоненты для чисел с плавающей точкой). Числа с плавающей запятой могут быть преобразованы с использованием экспоненциальной записи (4.1E 6).

А также (хотя это уже было дано deceze) глава об операторах сравнения:

Если вы сравниваете число со строкой или сравнение включает числовые строки, то каждая строка преобразуется в число, и сравнение выполняется численно.

Комментарии:

1. Очень хорошо, но вопрос был в том, почему из строки в целое , а не наоборот. @deceze, кажется, ответил на вопрос.

Ответ №2:

Он преобразует строки в числа, когда любой из операндов является числом. В руководстве это зашифровано следующим образом:

http://php.net/manual/en/language.operators.comparison.php

Для различных типов сравнение выполняется в соответствии со следующей таблицей (по порядку).

 Operand 1           Operand 2

null or string      string              Convert NULL to "", numerical
                                        or lexical comparison
...

string, resource    string, resource    Translate strings and resources
or number           or number           to numbers, usual math
  

Обратите внимание, что часть «по порядку» важна при чтении этой таблицы.

Ответ №3:

Из руководства

Когда строка вычисляется в числовом контексте, результирующее значение и тип определяются следующим образом.

Если строка не содержит ни одного из символов ‘.’, ‘e’ или ‘E’ и числовое значение вписывается в пределы целочисленного типа (как определено PHP_INT_MAX), строка будет вычислена как целое число. Во всех остальных случаях оно будет оцениваться как значение с плавающей точкой.

Значение задается начальной частью строки. Если строка начинается с допустимых числовых данных, это будет используемое значение. В противном случае значение будет равно 0 (нулю). Допустимые числовые данные — это необязательный знак, за которым следует одна или несколько цифр (необязательно содержащих десятичную точку), за которыми следует необязательный показатель степени. Показатель степени — это ‘e’ или ‘E’, за которым следует одна или более цифр.

Ответ №4:

Потому что именно так они разработали язык, как описано здесь.