#php #equality #comparison-operators
#php #равенство #сравнение-операторы
Вопрос:
php, мой дорогой старый друг-враг.
хорошо, итак, я могу смириться с тем, почему строка ‘0’ будет ложным значением. это справедливо, поскольку то, как '0'
это то же самое, что 0
на слабо типизированном языке, и 0
есть false
на слабо типизированном языке. таким образом, это дает, что false
== 0
== '0'
.
отлично, отлично… НО!! что это все значит?
<?php
print "number of surprised persons: " . ('false' == 0);
результат такой….
number of surprised persons: 1
насколько это разумно? я единственный, кого это удивляет? чего я не вижу?
дальнейшее тестирование показало, что целое число 0 равно (по operator ==)
0 <-- integer
false <-- boolean
null <-- just.. you know, null
'0' <-- string
'' <-- string
'false' <-- string
'true' <-- string
'null' <-- string
естественно, я в основном использую operator === для сравнения материала. и теперь, когда я знаю об этом, мне, конечно, придется скорректировать свое программирование, в этом нет вопросов. но все же! может ли кто-нибудь пролить свет на pl0x?
Комментарии:
1.
intval('false') ==> 0
, таким образом, преобразование преобразует оба значения в целые числа.
Ответ №1:
Это потому, что, когда вы сравниваете строку с целым числом, они оба не преобразуются в строки или в логические значения — они преобразуются в целые числа. Для PHP, когда вы думаете об этом, это совсем не странно (сравнительно, я полагаю).
'true' == 0
// is the same as
(int)'true' == 0
// is the same as
0 == 0
// is the same as
true
И это верно для любой нечисловой строки, а также для строки "0"
. Причина 1
вывода заключается в том, что строковая версия true
является 1
(а строковая версия false является пустой строкой).
Ответ №2:
Что касается вас, то вывод:
('false' == 0)
= логическое значение TRUE
= строка "1"
.
echo
запускает контекст строки.
Но из вашего комментария ниже я только что увидел, что вы хотели бы узнать больше о сравнении. Посмотрите, что вы делаете:
Example Name Result
$a == $b Equal TRUE if $a is equal to $b after type juggling.
итак, вы выполняете нестрогое сравнение числа со строкой:
Если вы сравниваете число со строкой или сравнение включает числовые строки, то каждая строка преобразуется в число, и сравнение выполняется численно. (ССЫЛКА)
Примечание: Число, а не целое число, как написано в принятом ответе:
<?php
print "number of surprised persons: " . ('false' == 0.3 - 0.2 - 0.1);
Получайте удовольствие.
Комментарии:
1. я понимаю, что если бы ‘false’ было равно 0, отображалось бы число 1. но почему строка должна быть равна 0?
2. @davogotland: Смотрите мой ответ ниже.
3. почему люди поддерживают этот ответ? очевидно, что отвечающий человек даже не прочитал мой вопрос до конца.
4. @davogotland: Я добавил недостающую информацию для вас, я действительно прочитал в вашем вопросе, что вы были удивлены результатом. В любом случае, даже если вы уже приняли ответ, вы все равно можете найти что-то интересное в моем отредактированном ответе.
Ответ №3:
false == 0 — это истина. Значение True в виде строки равно ‘1’, и вы выполняете неявное преобразование при интерполяции значения.
$a = true;
echo "$a"; #1
Вы можете найти таблицу истинности PHP здесь. Я бы просто рекомендовал компаратор ===, если у вас нет веских причин использовать ==
Комментарии:
1. я раньше не видел эту таблицу сравнения типов. они даже открыто заявляют там, что любая строка равна 0. почему кто-то хочет реализовать подобный язык? каковы преимущества этого?
2. @davogotland: Все языки (о которых я знаю), которые способны преобразовывать строку в целое число (неявно или явно), преобразуют нечисловые строки в 0. Это не специфично для PHP. Естественно,
intval("123bob")
равно 123, но как бы вы предложили язык для интерпретации intval («bob»)?