оператор php == (вид равенства) и целое число 0 - PullRequest
2 голосов
/ 12 октября 2011

php, моя дорогая старая дружка.

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

отлично хорошо ... НО !! О чем это все?

<?php
    print "number of surprised persons: " . ('false' == 0);

вывод ....

number of surprised persons: 1

как это разумно? я единственный, кто удивлен этим? что я не вижу?

дальнейшее тестирование доказало, что целое число 0 (оператор ==) равно

0        <-- integer
false    <-- boolean
null     <-- just.. you know, null
'0'      <-- string
''       <-- string
'false'  <-- string
'true'   <-- string
'null'   <-- string

естественно, я в основном использую оператор === для сравнения. и теперь, когда я знаю об этом, мне, конечно, придется скорректировать свое программирование, никаких вопросов по этому поводу. но до сих пор! может кто-нибудь пролить свет pl0x?

Ответы [ 3 ]

8 голосов
/ 12 октября 2011

Это потому, что когда вы сравниваете строку с целым числом, они оба не преобразуются в строки или в логические значения - они преобразуются в целые числа .Для 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 - пустая строка).

6 голосов
/ 12 октября 2011

Что касается вывода:

('false' == 0) = логическое значение TRUE = строка "1".

echo вызывает строковый контекст.

Но из вашего комментария ниже я только что увидел, что вы хотели бы узнать больше о сравнении.Посмотрите, что вы делаете:

Example     Name     Result
$a == $b    Equal    TRUE if $a is equal to $b after type juggling.

, так что вы делаете нестрогое сравнение числа со строкой:

Если вы сравниваете число со строкой илисравнение включает числовые строки, затем каждая строка преобразуется в число, и сравнение выполняется численно.( REF )

Примечание: число, а не целое число, как написано в принятом ответе:

<?php
print "number of surprised persons: " . ('false' == 0.3 - 0.2 - 0.1);

Получайте удовольствие.

3 голосов
/ 12 октября 2011

false == 0 верно. True, поскольку строка равна '1', и вы выполняете неявное преобразование при интерполяции значения.

$a = true;
echo "$a"; #1

Вы можете найти таблицу истинности PHP здесь. Я бы просто порекомендовал === компаратор, если у вас нет веских причин использовать ==

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

...