Intereting Posts
PHP htmlentities () на входе до вставки БД, а не на выходе Извлечение данных из базы данных MySql с использованием html-формы и php с демонстрацией Symfony2 Использовать локаль по умолчанию в маршрутизации (один URL для одного языка) Счетчик страниц cookie в php Как функция автоматического вызова в php для вызова любой другой функции Получение значения комбинированного блока с использованием метода post Как я могу получить возвращаемое регистром возвращение из array_intersect () DomXPath с DOMDocument для получения URL-адреса класса <img> Числовая дата в текстовую дату PHP Почему функции mysql_ PHP устарели? Ошибка HTACCESS 404 не работает должным образом Почему file_get_contents работают с google.com, но не с моим сайтом? Нужна помощь в вычислении долготы и широты средней точки с использованием javascript из значений php Можно ли использовать аутентификацию в RSS-каналах, используя php? код покрытия xDebug и PHPUnit говорит 100%, на самом деле это не

Почему (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 

Может кто-нибудь объяснить это?

Операторы == и != Не сравнивают тип. Поэтому PHP автоматически преобразует «Hello» в целое число, которое равно 0 ( intval('Hello') ). Если вы не уверены в типе, используйте операторы сравнения типов === и !== . Или лучше убедитесь, какой тип вы обрабатываете в любой момент вашей программы.

Другие уже хорошо ответили на вопрос. Я хочу только дать некоторые другие примеры, о которых вы должны знать, все они вызваны жонглированием типа 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'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