В духе оценки коротких замыканий, таких как «и» Python, и при сохранении результатов проверок я решил посмотреть, как это можно было бы лучше всего решить на PHP, но у меня возникла проблема.
неожиданный
<?php function check_a() { return 'A'; } function check_b() { return 'B'; } function check_c() { return 'C'; } if($a = check_a() && $b = check_b() && $c = check_c()) { var_dump($a); var_dump($b); var_dump($c); }
Результаты в:
bool(true) bool(true) string(1) "C"
код для того, что я хотел произойти
<?php function check_a() { return 'A'; } function check_b() { return 'B'; } function check_c() { return 'C'; } // if(($a = check_a()) && ($b = check_b()) && $c = check_c()) // equivalent to line below if(($a = check_a()) && ($b = check_b()) && ($c = check_c())) { var_dump($a); var_dump($b); var_dump($c); }
Результаты в:
string(1) "A" string(1) "B" string(1) "C"
Почему неожиданный пример действует таким образом?
Это вопрос приоритетности оператора . Выражение присваивания возвращает назначенное значение , поэтому вы ожидаете получить A и B для первых двух операций. Причина, по которой вы получаете логическое значение true заключается в том, что оператор && имеет более высокий приоритет, чем оператор присваивания, поэтому в исходном выражении
$a = check_a() && $b = check_b() && $c = check_c()
$a получает значение check_a() && $b = check_b() && $c = check_c() ,
$b получает значение check_b() && $c = check_c() ,
и $c получает значение check_c() .
Выражения check_a() && $b = check_b() && $c = check_c() и check_b() && $c = check_c() возвращают логическое значение true , так как использование оператора && вызывает выражение, которое должно быть оценено как booleans , и все компоненты выражений, соединенных с помощью && оцениваются как true .
Чтобы получить ожидаемые результаты, вы можете добавлять скобки так же, как и вы, или использовать вместо логического оператора вместо && , потому что он имеет более низкий приоритет, чем оператор присваивания.
if($a = check_a() and $b = check_b() and $c = check_c()) {
Результат boolean && – это bool! && связывает сильнее = . Поэтому $b присваивается ('B' && $c) что является bool … То же, очевидно, с $a …