布尔条件内带有函数的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循环的主要内容,如果未能解决你的问题,请参考以下文章

python初体验-循环

Java基础While循环详解

Java基础 -4.3

怎么跳出while循环

如果函数内部的条件失败,则跳过 bash while 循环

while循环,布尔类型,可变or不可变,数字,字符串,列表,元组,字典