Почему PHP преобразовывает String в Integer?

Я хотел бы знать, на каком этапе PHP решает, когда конвертировать из String в Integer и наоборот

Пример:

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

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

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

    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 

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

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

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

    Подробные сведения см. В разделе « Тип жонглирования» и « Таблица сравнения типов» и « Преобразование строк» .

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

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

    И глава о струнах:

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

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

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

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

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

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

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

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