Типовое приведение к логическому - PullRequest
44 голосов
/ 05 декабря 2011

Может кто-нибудь объяснить мне, почему это:

var_dump((bool) 1==2);

возвращает

bool(true)

, но

var_dump(1==2);

возвращает

bool(false)

ИзКонечно, второе возвращение верное, но почему в первом случае php возвращает неожиданное значение?

Ответы [ 4 ]

87 голосов
/ 05 декабря 2011

Это на самом деле не так странно, как кажется.(bool) имеет более высокий приоритет, чем ==, поэтому это:

var_dump((bool) 1==2);

эквивалентно этому:

var_dump(  ((bool) 1)   == 2);

или этому:

var_dump(true == 2);

Из-за жонглирования типа , 2 также по существу получает приведение к bool (так как это «свободное сравнение»), так что это эквивалентно этому:

var_dump(true == true);

или это:

var_dump(true);
20 голосов
/ 05 декабря 2011

Потому что в первом примере приведение происходит перед сравнением. Так что, как будто вы написали

((bool) 1)==2

, что эквивалентно

true == 2

, который оценивается путем преобразования 2 в true и сравнения, что в конечном итоге дает true.

Чтобы увидеть ожидаемый результат, вам нужно добавить парены, чтобы сделать порядок явным:

var_dump((bool)(1==2));

увидеть его в действии .

7 голосов
/ 13 января 2014

Я использую этот способ:

!!0 (false)
!!1 (true)
0 голосов
/ 28 января 2017

То, как вы написали оператор ((bool) 1 == 2), всегда будет возвращать true, потому что он всегда будет выполнять код, как показано ниже:

Сначала будет выполнено

(bool)1

и (bool) 1 вернет true.

Теперь, поскольку (bool) 1 верно на втором шаге, ваше утверждение будет похоже на

true ==2

Так как, если мы приведем тип 2 к логическому значению, он вернет true, в конечном состоянии ваше утверждение будет похоже на

true == true

Что, очевидно, вернет истину. То же самое я объяснил год назад в своем посте Приведение типов PHP .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...