布尔条件内带有函数的while循环
Posted
技术标签:
【中文标题】布尔条件内带有函数的while循环【英文标题】:While loop with a function inside the boolean condition 【发布时间】:2016-09-19 16:30:17 【问题描述】:我在网上看到了很多代码,其中有一个函数在while循环的布尔条件内为变量赋值:
while ($var = testfunction($param1, $param2))
echo "hello world!<br>";
问题:
在布尔条件($var = testfunction($param1, $param2))
中发生的事件顺序是什么? while
判断的值是真的还是假的?
我自己的测试:
我已经完成了自己的测试。当函数完全为空,并且没有返回任何内容时,while 循环内的代码不会执行,但是当函数testfunction()
返回TRUE
时,while 循环内的代码会继续执行。这使我推断while
条件正在检查$var
中的结果值是什么。因此,如果函数将布尔值返回到$var
,那么这将是while
判断的条件。这也让我相信,如果$var
最终成为一个数字,那么任何==0
都将等同于假,而任何!=0
都将等同于真。
这些是我的推论,虽然我没有找到它们背后的任何文件,我的分析可能是错误的。
【问题讨论】:
while语句的意思很简单。它告诉 php 重复执行嵌套语句,只要 while 表达式的计算结果为 TRUE 我很欣赏这个写得很好的问题!也就是说,最简单的解释就像文档 (php.net/while) 所说:“它告诉 PHP 重复执行嵌套语句,只要 while 表达式的计算结果为 TRUE。” @Dagon @JoelHinz 当你说表达时,你到底指的是什么?表达式字面上是变量$var
吗?因为如果表达式是$var = testfunction(..)
一起的语句,那么我会假设它应该始终评估为TRUE
(我执行的测试不是这种情况),因为无论返回值如何,它总是被成功执行.
不,while
循环正在评估$var
,其值设置为函数testfunction(...)
的返回值。因此,只要函数返回 true 或任何真实的值(如数字、字符串、数组、对象),while 循环就会继续运行。换句话说,while
循环对$var
: 执行布尔检查,并查看在布尔模式下评估为真/假的内容refer to the PHP docs。
扩展@Terry - 基本上它说运行循环,直到 $param1 或 $param2 中的某些内容发生更改以使函数返回 false 而不是 true。
【参考方案1】:
整个表达式正在执行,其值转换为boolean。
($var = testfunction($param1, $param2))
首先,将调用testfunction(...)
,然后进行分配。根据manual:
赋值表达式的值就是被赋值的值。
所以返回并分配给$var
的任何内容都将转换为布尔值并由WHILE
循环进行评估。如果分配的值为 null、[]、0 等,则不会执行来自 while 循环的代码块。否则会被执行。
【讨论】:
【参考方案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))
,如果您不在此条件之外的其他地方使用返回值,则行为会相同且更清晰。
【讨论】:
一个简短的脚本来演示这个答案的解释:$foo = array(3,2,1,0,1,2,3); $i = 0; while($bar = $foo[$i]) echo $bar."\n";$i++;
。运行它,表达式的计算方式应该会变得很明显。【参考方案3】:
while 条件在被调用的函数运行并将其返回值分配给$var
之后,对$var
的值执行类型强制转换为布尔值。因此,如果函数返回一个计算结果为 FALSE 的值,则存在 while 循环,否则它将运行它的代码块进行本次迭代。
php documentation 准确显示了哪些值评估为 false,请参见以下列表:
当转换为布尔值时,以下值被视为 FALSE:
布尔值 FALSE 本身
整数 0(零)
浮点数 0.0(零)
空字符串和字符串“0”
零元素的数组
一个成员变量为零的对象(仅限 PHP 4)
特殊类型NULL(包括未设置的变量)
从空标签创建的 SimpleXML 对象
所有其他值都被视为 TRUE(包括任何资源)。
【讨论】:
以上是关于布尔条件内带有函数的while循环的主要内容,如果未能解决你的问题,请参考以下文章