Intereting Posts
Система дружбы с Laravel: отношения Many to Many MYSQL возвращает повторяющиеся строки Использует ли facebook комету или ajax для своих уведомлений? Использование почты PHP из нескольких почтовых клиентов (Yahoo | Google | Hotmail | Rediff | Личный почтовый домен) http_build_query () без кодировки url php получает правильную дату по неделям один год, используя strtotime Не удалось создать COM-объект «X»: класс, не зарегистрированный в другой WAMP Список PHP native_type для PDO getColumnMeta () PHP / PostgreSQL: запись двоичных данных с подготовленными операторами Сортируйте массив, используя тот же порядок другого Как передать несколько параметров в библиотеку в CodeIgniter? google api calendar php Распечатайте шаблон для отображения чисел до 5 строк и 5 столбцов, таких как 5 4 3 2 1 и в следующей строке 4 3 2 1 5 до 5-й строки Определить свойство zerofill и размер при миграции схемы поля с помощью laravel Windows Installing PHPUnit через PEAR – Установка PHPUnit через PEAR

PHP сравнивает равенство, пустую строку, «0» и 0

Я узнал, что пустая строка "", 0 и "0" означает значение false в php. Интересно, понимает ли php это, когда дело доходит до сравнения равенства.

$str = ""; echo ($str == "0") ? "yes" : "no"; // prints "no" (A) echo ($str == 0) ? "yes" : "no"; // prints "yes" (B) 

Строка A предполагает, что php сравнивает $ str и «0», как если бы они были всеми строками, игнорируя, что оба они могут означать false. Но строка В сравнивает их «ложную» интерпретацию.

Так происходит, что php сначала проверяет, имеют ли два значения один и тот же тип, если он проверяет равенство, предполагая тот же тип; если нет, он использует логические значения значений (есть ли задействование типа?)

Я узнал, что пустая строка "", 0 и "0" означает значение false в php.

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

== проверяет значения двух переменных. Если их типы различны, происходит кастинг и непредсказуемый (для новобранцев) результат.

=== проверяет значения двух переменных и их типов.

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

Примечание: "8abc" становится 8 после литья в целое. abc8 становится 0 при abc8

Руководство по:
– Типы литья (жонглирование)
– Сравнение типов

В PHP есть два компаратора равенства

Когда типы одинаковы, они ведут себя одинаково.

Когда типы разные, все зависит от того, что PHP не использует оба значения для булевых. Это зависит от типов обоих операндов, и есть таблица, чтобы знать, что сделает PHP (см. Вторую ссылку).

Я рекомендую прочитать этот вопрос в stackoverflow. Как различаются операторы сравнения PHP (== double equals) и идентичности (=== triple equals)?

Кроме того, руководство по PHP для сравнения http://au.php.net/manual/en/language.operators.comparison.php

 // double equal will cast the values as needed followin quite complex rules 0 == '0' // true, because PHP casted both sides to numbers // triple equals returns true only when type and value match 0 === '0' // false 
 $str = ""; //Comparing two strings, no implicit type conversion happens. Since // "" is not equal "0", result is FALSE echo ($str == "0") ? "yes" : "no"; // prints "no" (A) //Comparing a STRING to an INT,implicit conversion happens to convert // the string "" to an INT. Since "" has no digits, it's evaluated // to 0. Hence, result of comparison is TRUE echo ($str == 0) ? "yes" : "no"; // prints "yes" (B) 

Используйте «===» для более точного сравнения.