为什么循环中的这个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 次迭代,但总是打印第一次迭代的返回值。我觉得我一定错过了一些非常明显的东西,因为这毫无意义。
有人可以解释一下这里发生了什么,因为我似乎无法以我认为可以的方式使用该赋值和检查构造。
回答
问题是顺序
$fn_retval = do_the_thing($count) !== false
被评估。如果您检查Operator Precedence,您将看到它!==的优先级高于=,因此它被评估为
do_the_thing($count) !== false
然后将结果分配给$fn_retval。
要强制您遵循的顺序,请先使用方括号明确进行分配...
while (($fn_retval = do_the_thing($count)) !== false) {