2016-03-07 4 views
5

У меня есть этот код:Очень странное поведение в PHP

$test = 0; 
if ($test == "on"){ 
    echo "TRUE"; 
} 

Результат этого кода будет:

TRUE 

ПОЧЕМУ ??? Моя версия PHP: 5.4.10.

+1

http://stackoverflow.com/questions/672040/comparing-string-to-integer-gives-strange-results – markdwhite

+0

потому что '(int)" on "' равно '0' – Armen

+0

@Armen на самом деле,' int 'из * ANY * string равно 0, поэтому всегда будет true, если сравнивать с 0. (try' intval ("anystringyouwanthere") ') – morcen

ответ

3

Если вы сравниваете число со строкой или сравниваете числовые строки, то каждая строка преобразуется в число и выполняется сравнение численно. Эти правила также применяются к оператору switch. Преобразование типа не происходит, когда сравнение === или! ==, поскольку это предполагает сравнение типа, а также значения.

$test = 0; 
if ($test === "on"){ 
    echo "TRUE"; 
} 

PHP преобразует строку в число, чтобы сравнить. Используя ===, будет сравниваться значение, а также тип данных.

var_dump(0 == "a"); // 0 == 0 -> true 
var_dump("1" == "01"); // 1 == 1 -> true 
var_dump("10" == "1e1"); // 10 == 10 -> true 
var_dump(100 == "1e2"); // 100 == 100 -> true 

Docs

+0

Да. === отлично работает. Но 0! = "On", я так думаю :) – Weltkind

+0

Это из-за конверсии. Проверьте обновления. –

0

Это происходит потому, что ваши делают ==
0 является целым числом, так в этом on преобразуется в целое, которое является 0
Так ваш, если заявление выглядит 0==0

Для решения Вы для использования ===

if ($test === "on") 
4

Поскольку вы сравниваете $test со строковым значением, а не двоичным значением, если вы хотите сравнить со строковым значением, попробуйте сравнить ===, для value + dataType.

В вашем примере var_dump(0=="on"); всегда возвращает bool(true).

Но когда вы используете var_dump(0==="on");, он даст вам bool(false).

Example from PHP Manual:

var_dump(0 == "a"); // 0 == 0 -> true 
var_dump("1" == "01"); // 1 == 1 -> true 
var_dump("10" == "1e1"); // 10 == 10 -> true 
var_dump(100 == "1e2"); // 100 == 100 -> true 
3

Если сравнить число со строкой или сравнение включает в себя числовые строки, то каждая строка преобразуется в число, и сравнение выполняется численно. Эти правила также применяются к оператору switch. Преобразование типа не происходит, когда сравнение === или! ==, поскольку это предполагает сравнение типа, а также значения.

Для сравнения используйте «===».

см ссылки: http://php.net/manual/en/language.operators.comparison.php

0

В PHP, рыхлое сравнение между целым и нечисловой строкой (то есть строкой, которая не может быть интерпретирована как числовые, такими как «PHP», или в вашем случае «на») приведет к строка, которая будет интерпретирована как целое число со значением 0. Обратите внимание, что числовые «43», «1е3» или «123» являются числовой строкой и будут правильно интерпретироваться как числовое значение.

Я знаю, что это странно.

Смежные вопросы