PHP - когда ноль равен "а" [дубликат]
На этот вопрос уже есть ответ здесь:
- Почему PHP считает, что 0 равно строке? 7 ответов
Недавно у меня была ошибка, которая ставила меня в тупик.... проследил ее до следующего (упрощенного) утверждения, в котором приведен реальный пример
function test_it($team)
{ echo (($team=="a") ? "Yep it is!" : "No Way");
}
Итак, если я выполню test_it(0);
, я получу результат "Да, это так!" ??
Логика утверждения выглядит нормально, но, очевидно, чтобы получить правильный результат, мне нужно было сделать это "==="....
Может ли кто-нибудь объяснить, почему это так? Просто чтобы помочь мне понять, почему/чего мне следует избегать в будущем.
5 answers
Это потому, что жонглирование типами превратит ваш "a"
в целое число для сравнения. Так что, по сути, это то, что работает:
if (0 == (int)"a")
И, конечно, (int)"a"
будет оцениваться как 0
, вы можете прочитать больше о жонглировании типами здесь.
Это из-за строки/символа a, т.е. "a" и проходящего через 0.
Оператор === выполняет "типобезопасное сравнение"
Проверьте эту ссылку .
С помощью ==
вы выполняете свободное сравнение. Согласно таблице в ссылке, этот тип сравнения между 0
(целое число) и "something"
(строка) приведет к TRUE
.
Оператор == просто проверяет, равны ли левое и правое значения. Но оператор === (обратите внимание на дополнительное "=") фактически проверяет, равны ли левое и правое значения, а также проверяет, имеют ли они один и тот же тип переменной (например, являются ли они оба логическими, int и т. Д.)
Теперь сделайте echo (int)"a";
, вы получите 0, и это допустимо для любой строки.
В PHP любая строка, не начинающаяся с числовых значений, равна ==
0. Например, вот образец с различными сравнениями, и в результате echo
:
$team = 0;
echo (($team=="a") ? "Yep it is!" : "No Way"); // Yep it is!
echo (($team=="abc") ? "Yep it is!" : "No Way"); // Yep it is!
echo (($team=="a really long string") ? "Yep it is!" : "No Way"); // Yep it is!
По-видимому, на самом деле это не ошибка, подробнее об этом читайте здесь> https://bugs.php.net/bug.php?id=44999.