#php
#php
Вопрос:
Я очень смущен выводом этого небольшого фрагмента тестового кода:
<?php
$count = 0;
while ($fn_retval = do_the_thing($count) !== false) {
print $fn_retval."n";
$count ;
}
function do_the_thing($count) {
if ($count > 3) {
return false;
} else {
return $count;
}
}
?>
Вывод:
$ php ./test.php
1
1
1
1
Таким образом, он правильно выполняет 4 итерации, но всегда печатает возвращаемое значение первой итерации. Я чувствую, что, должно быть, пропустил что-то действительно очевидное, потому что это не имеет смысла.
Может кто-нибудь объяснить, что здесь происходит, потому что кажется, что я не могу использовать эту конструкцию назначения и проверки так, как я думал, что смогу.
Комментарии:
1. Просто измените его на
while ($fn_retval = do_the_thing($count))
Ответ №1:
Проблема в том, что порядок, в котором
$fn_retval = do_the_thing($count) !== false
оценивается. Если вы проверите приоритет оператора, вы увидите, что !==
это более высокий приоритет, чем =
, поэтому он оценивается как
do_the_thing($count) !== false
и затем результат присваивается $fn_retval
.
Чтобы принудительно установить требуемый порядок, используйте скобки, чтобы сначала явно выполнить назначение…
while (($fn_retval = do_the_thing($count)) !== false) {
Комментарии:
1. Приоритет! Конечно! Я знал, что упускаю что-то очевидное. С вашей модификацией это работает так, как я ожидал.