Эй, если у вас есть следующий код и вы хотите проверить, совпадает ли $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
Может кто-нибудь объяснить это?
Операторы ==
и !=
Не сравнивают тип. Поэтому PHP автоматически преобразует «Hello» в целое число, которое равно 0
( intval('Hello')
). Если вы не уверены в типе, используйте операторы сравнения типов ===
и !==
. Или лучше убедитесь, какой тип вы обрабатываете в любой момент вашей программы.
Другие уже хорошо ответили на вопрос. Я хочу только дать некоторые другие примеры, о которых вы должны знать, все они вызваны жонглированием типа PHP. Все следующие сравнения вернут true :
Поскольку я нашел это поведение опасным, я написал свой собственный метод равный и использовал его в своих проектах:
/** * 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's 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; }
Надеюсь, это поможет кому-то сделать его заявление более солидным, оригинальную статью можно найти здесь: Равный или не равный
почти любое ненулевое значение преобразуется в true в php за кулисами.
поэтому 1, 2,3,4, «Hello», «world» и т. д. будут равны true, тогда как 0 равно false
единственная причина! == работает, потому что сравнение типов данных тоже самое
Потому что PHP делает автоматический приведение для сравнения значений разных типов. В документации PHP вы можете увидеть таблицу критериев преобразования типов .
В вашем случае строка "Hello"
автоматически преобразуется в число, равное 0
согласно PHP. Отсюда истинное значение.
Если вы хотите сравнить значения разных типов, вы должны использовать операторы типа:
$value1 === $value2;
или
$value1 !== $value2;
В общем, PHP оценивает до нуля каждую строку, которая не может быть распознана как число.
В php строка «0» преобразуется в логическое значение FALSE http://php.net/manual/en/language.types.boolean.php