Почему это назначение PHP в цикле всегда выводит первое значение?

#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. Приоритет! Конечно! Я знал, что упускаю что-то очевидное. С вашей модификацией это работает так, как я ожидал.