оператор php == (своего рода равенство) и целое число 0

#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 здесь. Я бы просто рекомендовал компаратор ===, если у вас нет веских причин использовать ==

http://php.net/manual/en/types.comparisons.php

Комментарии:

1. я раньше не видел эту таблицу сравнения типов. они даже открыто заявляют там, что любая строка равна 0. почему кто-то хочет реализовать подобный язык? каковы преимущества этого?

2. @davogotland: Все языки (о которых я знаю), которые способны преобразовывать строку в целое число (неявно или явно), преобразуют нечисловые строки в 0. Это не специфично для PHP. Естественно, intval("123bob") равно 123, но как бы вы предложили язык для интерпретации intval («bob»)?