Почему (0 == 'Hello') возвращает true в PHP?
Эй, если у вас есть следующий код и вы хотите проверить, соответствует ли $key
Hello
, что сравнение всегда возвращает true
, если переменная 0
. Я натолкнулся на это, когда массив для специального ключа и задался вопросом, почему он не работает должным образом.
См. Этот код для примера.
$key = 1;
if ($key != 'Hello') echo 'Hello'; //echoes hello
$key = 2;
if ($key != 'Hello') echo 'Hello'; //echoes hello
$key = 0;
if ($key != 'Hello') echo '0Hello'; //doesnt echo hello. why?
if ($key !== 'Hello') echo 'Hello'; //echoes hello
Кто-нибудь может это объяснить?
Ответы
Ответ 1
Операторы ==
и !=
не сравнивают тип. Поэтому PHP автоматически преобразует "Hello" в целое число, которое 0
(intval('Hello')
). Если вы не уверены в типе, используйте операторы сравнения типов ===
и !==
. Или лучше убедитесь, какой тип вы обрабатываете в любой момент вашей программы.
Ответ 2
Другие уже хорошо ответили на вопрос. Я хочу только дать некоторые другие примеры, о которых вы должны знать, все они вызваны жонглированием типа PHP. Все следующие сравнения вернут true:
- 'abc' == 0
- 0 == null
- '' == null
- 1 == '1y? z'
Поскольку я нашел это поведение опасным, я написал свой собственный метод равный и использовал его в своих проектах:
/**
* Checks if two values are equal. In contrast to the == operator,
* the values are considered different, if:
* - one value is null and the other not, or
* - one value is an empty string and the other not
* This helps avoid strange behavier with PHP type juggling,
* all these expressions would return true:
* 'abc' == 0; 0 == null; '' == null; 1 == '1y?z';
* @param mixed $value1
* @param mixed $value2
* @return boolean True if values are equal, otherwise false.
*/
function sto_equals($value1, $value2)
{
// identical in value and type
if ($value1 === $value2)
$result = true;
// one is null, the other not
else if (is_null($value1) || is_null($value2))
$result = false;
// one is an empty string, the other not
else if (($value1 === '') || ($value2 === ''))
$result = false;
// identical in value and different in type
else
{
$result = ($value1 == $value2);
// test for wrong implicit string conversion, when comparing a
// string with a numeric type. only accept valid numeric strings.
if ($result)
{
$isNumericType1 = is_int($value1) || is_float($value1);
$isNumericType2 = is_int($value2) || is_float($value2);
$isStringType1 = is_string($value1);
$isStringType2 = is_string($value2);
if ($isNumericType1 && $isStringType2)
$result = is_numeric($value2);
else if ($isNumericType2 && $isStringType1)
$result = is_numeric($value1);
}
}
return $result;
}
Надеюсь, это поможет кому-то сделать его приложение более прочным, оригинальную статью можно найти здесь:
Равно или не равно
Ответ 3
почти любое ненулевое значение преобразуется в true в php за кулисами.
так что 1, 2,3,4, 'Hello', 'world' и т.д. будут равны true, тогда как 0 равно false
единственная причина! == работает, потому что сравнение типов данных тоже самое.
Ответ 4
Потому что PHP делает автоматический приведение для сравнения значений разных типов. В документации PHP вы можете увидеть таблицу критериев преобразования типов.
В вашем случае строка "Hello"
автоматически преобразуется в число, которое 0
соответствует PHP. Следовательно, истинное значение.
Если вы хотите сравнить значения разных типов, вы должны использовать операторы типа:
$value1 === $value2;
или
$value1 !== $value2;
В общем, PHP оценивает до нуля каждую строку, которая не может быть распознана как число.
Ответ 5
В php строка "0" преобразуется в логическое значение FALSE http://php.net/manual/en/language.types.boolean.php