Сравнение String с Integer дает странные результаты

Я очень смущен, почему эта операция работает. Может кто-нибудь объяснить это?

$test1 = "d85d1d81b25614a3504a3d5601a9cb2e"; $test2 = "3581169b064f71be1630b321d3ca318f"; if ($test1 == 0) echo "Test 1 is Equal!?"; if ($test2 == 0) echo "Test 2 is Equal!?"; // Returns: Test 1 is Equal!? 

Для уточнения, я пытаюсь сравнить строку "0" с переменными $test . Я уже знаю, чтобы исправить код, который я могу просто заключить (как и следовало бы) 0 в "" s

Мне интересно, если это ошибка PHP, ошибка сервера или какая-то действительная операция. Согласно http://us3.php.net/types.comparisons это не сработало.

Edit: Scratch, что, по-видимому, он упоминает, что Loose сравнения между строкой и 0 истинны. Но я все еще не знаю, почему.

Изменить 2: я пересмотрел свой вопрос, почему значение $test2 для "3581169b064f71be1630b321d3ca318f" не работает?

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

Преобразование строк в номера

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

Строка будет оцениваться как float, если она содержит какие-либо символы '.', 'E' или 'E'. В противном случае он будет оцениваться как целое число.

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

Преобразование типов с использованием оператора ==

Оператор == – это слабо типизированное сравнение. Он преобразует оба типа в общий тип и сравнивает их. Здесь объясняется способ преобразования строк в целые числа.

Обратите внимание, что страница, с которой вы связаны , не противоречит этому. Проверьте вторую таблицу, где говорится, что сравнение целого числа 0 с строкой "php" с использованием == должно быть истинным.

Случается, что строка преобразуется в целое число, а нечисловые строки (строки, которые не содержат или начинаются с числа) преобразуются в 0 .

Числовые и нечисловые строки

Строка, состоящая из числа или начинающаяся с числа, считается числовой строкой . Если после этого числа строка имеет другие символы, они игнорируются.

Если строка начинается с символа, который не может быть интерпретирован как часть числа, то это нечисловая строка и преобразуется в 0 . Это не означает, что числовая строка должна начинаться с цифры (0-9) – например, "-1" – это числовая строка, потому что знак «минус» является частью числа в этом случае.

Так, например, ваша строка "d85d1d81b25614a3504a3d5601a9cb2e" не начинается с числа, поэтому она преобразуется в 0 . Но ваша вторая строка "3581169b064f71be1630b321d3ca318f" будет преобразована в целое число 3581169 . Вот почему ваш второй тест работает не так.

Что ты должен делать

Вы, вероятно, хотите:

 if ($test1 === "0") 

Обратите внимание на использование тройных равных вместо двойных равных. Это гарантирует, что то, что вы сравниваете, представляет собой строку, содержащую только цифру нуля, и предотвращает преобразование любого типа.

После некоторого расследования выясняется, что в руководстве по PHP упоминается, что любые строки, которые не начинаются с числа, будут преобразованы в 0 при литии как целое.

Это значит, что:

 ("php" == 0) === true ("1php" == 0) === false 

Очень раздражает и плохо документируется. Это было в нижней части комментариев на странице сравнения типов.

 $test1 = "d85d1d81b25614a3504a3d5601a9cb2e"; 

эта строка начинается с символа «d», который не является допустимым числом, var будет принимать значение 0 и ваш тест №1 пройдет.

 $test2 = "3581169b064f71be1630b321d3ca318f"; 

эта строка начинается с 3581169, которая является допустимым числом, поэтому переменная будет разрешать это значение, которое не равно 0. Таким образом, ваш тест №2 не пройдет.

Я использовал некоторые преобразования и сравнения, чтобы проверить, является ли числовая строка числом:

 $test1="19de6a91d2ca9d91721d82f1bd8102b6"; echo (float)$test1==$test1; //TRUE echo is_float($test1); //FALSE //Converting the string to float and then converting it to string and compare will do the trick echo (string)((float)$test1)==(string)$test1; //FALSE $test2="5.66"; echo (float)$test2==$test2; //TRUE //Testing the numeric string using `is_float` wont give the expected result echo is_float($test2); //FALSE echo (string)((float)$test2)==(string)$test2; //TRUE