在布尔条件中使用函数的while循环

3

我看到很多在线代码都在while循环的布尔条件中为变量赋值:

while ($var = testfunction($param1, $param2))
{
  echo "hello world!<br>";
}

问题:

在布尔条件($var = testfunction($param1, $param2))内部发生的事件序列是什么?如果为真,则while判断哪个值是否为真或不为真?

我的测试:

我已经进行了自己的测试。当函数完全为空并且没有返回任何内容时,循环内的代码不执行,但是当函数testfunction()返回TRUE时,循环内的代码将继续执行。这导致我推断出while条件正在检查$var内的结果值。因此,如果函数返回一个布尔值到$var 中,则该布尔值将是while判断的条件。这也使我相信,如果$var 最终成为数字,则任何 == 0 都将等于false,而任何!= 0 都将等于true。

这些是我的推论,尽管我没有找到任何相关文档并且我的分析可能是错误的。


2
while语句的含义很简单。只要while表达式的值为TRUE,它就告诉PHP重复执行嵌套的语句。 - user557846
2
我很欣赏这个写得很好的问题!话虽如此,最简单的解释就像文档(http://php.net/while)所说的那样:“只要 while 表达式的值为 TRUE,它就告诉 PHP 重复执行嵌套的语句。” - Joel Hinz
@Dagon @JoelHinz 当你说表达式时,你确切指的是什么?表达式是否就是变量$var本身?因为如果表达式是整个语句$var = testfunction(..),那么我会认为它应该总是评估为TRUE(但在我执行的测试中并非如此),因为它总是成功执行而不管返回值如何。 - Webeng
2
不,while循环正在评估$var,其值设置为函数testfunction(...)的返回值。因此,只要函数返回true或任何真值(如数字、字符串、数组、对象),while循环就会继续运行。换句话说,while循环对$var执行布尔检查:要查看在布尔模式下被评估为true/false的内容,请参考PHP文档 - Terry
你可以在http://php.net/manual/en/language.types.boolean.php获取所有的假值。 - Garvit Mangal
显示剩余3条评论
3个回答

2

实际上,while 是基于条件 $var 存在/具有“真实”值。

你本来会写成:

$var = testfunction($param1, $param2);
while ($var){
 echo "whateveryouwant";
 $var = testfunction($param1, $param2);
}

在执行时,这两种写法的行为是完全相同的,第一种写法更加清晰,因为while ($var = testfunction($param1, $param2))的条件是基于$var = testfunction($param1, $param2)的值的,而$var的值等于testfunction($param1, $param2)的返回值。
如果你只在这个条件中使用返回值,那么也可以这样写:while (testfunction($param1, $param2)),这样更加简洁。

1
一个简短的脚本来演示这个答案所解释的内容:$foo = array(3,2,1,0,1,2,3); $i = 0; while($bar = $foo[$i]) {echo $bar."\n";$i++;}。运行它,你就会明白表达式是如何被评估的。 - Thorbear

2
整个表达式被执行,并将其值转换为boolean
($var = testfunction($param1, $param2))

首先,将调用testfunction(...),然后进行赋值操作。根据手册的描述:

赋值表达式的值是被赋的值。

因此,无论返回并分配给$var的是什么,都将转换为布尔值并由WHILE循环进行评估。如果分配的值为null、[]、0等,则不会执行while循环中的代码块。否则将执行该代码块。

0

while循环条件对$var的值进行布尔类型强制转换,此时已经调用了函数并将其返回值赋给了$var。因此,如果函数返回一个被评估为FALSE的值,则while循环结束,否则它将运行本次迭代的代码块。

php文档 明确列出了哪些值被评估为false,请参见以下列表:

在转换为布尔值时,以下值被视为FALSE:

布尔值FALSE本身

整数0(零)

浮点数0.0(零)

空字符串和字符串“0”

具有零个元素的数组

具有零个成员变量的对象(仅适用于PHP 4)

特殊类型NULL(包括未设置的变量)

从空标记创建的SimpleXML对象

其他所有值都被视为TRUE(包括任何资源)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接