Может кто-нибудь объяснить мне, почему это:
var_dump((bool) 1==2);
возвращает
bool(true)
но
var_dump(1==2);
возвращает
bool(false)
Конечно, второе возвращение верно, но почему в первый раз php возвращает неожиданное значение?
Может кто-нибудь объяснить мне, почему это:
var_dump((bool) 1==2);
возвращает
bool(true)
но
var_dump(1==2);
возвращает
bool(false)
Конечно, второе возвращение верно, но почему в первый раз php возвращает неожиданное значение?
На самом деле это не так странно. (bool)
имеет более высокий приоритет, чем ==
, так что:
var_dump((bool) 1==2);
эквивалентно этому:
var_dump( ((bool) 1) == 2);
или это:
var_dump(true == 2);
Из-за типа жонглирования, 2
также по существу получает отличное от bool
(так как это "свободное сравнение" ) поэтому он эквивалентен этому:
var_dump(true == true);
или это:
var_dump(true);
Потому что в первом примере литье происходит перед сравнением. Так что, как будто вы написали
((bool) 1)==2
что эквивалентно
true == 2
который вычисляется путем преобразования 2
в true
и сравнения, в конечном итоге производя true
.
Чтобы увидеть ожидаемый результат, вам нужно добавить parens, чтобы сделать порядок явным:
var_dump((bool)(1==2));
Я использую этот способ:
!!0 (false)
!!1 (true)
То, как вы написали оператор ((bool) 1 == 2), всегда будет возвращать true, потому что он всегда будет выполнять код, как показано ниже:
Сначала он выполнит
(bool)1
и (bool) 1 вернет true.
Теперь, когда (bool) 1 на втором шаге будет истинным, ваш оператор будет выглядеть как
true ==2
Так как если мы будем выводить 2 в boolean, он вернет true, в конечном состоянии ваш оператор будет выглядеть как
true == true
Что, очевидно, вернет true. То же самое, что я объяснил год назад в своем сообщении PHP Type casting.