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

时间:2016-05-22 21:54:26

标签: php function while-loop

我见过很多在线代码,它有一个函数为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等同于真。

这些是我的推论,虽然我没有找到任何背后的文件,但我的分析可能是错的。

3 个答案:

答案 0 :(得分:2)

实际上,while基于$var存在/获得值的条件&#34;真实地&#34;。

你会写下:

$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))

你也可以写CREATE OR REPLACE FUNCTION f_generate_password() RETURNS text AS $BODY$ DECLARE vPassword text; chars text; BEGIN vPassword := ''; chars := 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; WHILE((select COALESCE(substring(vPassword from '.*[a-z]+.*'),'')) = '' OR (select COALESCE(substring(vPassword from '.*[A-Z]+.*'),'')) = '' OR (select COALESCE(substring(vPassword from '.*[0-9]+.*'),'')) = '') LOOP vPassword := ''; FOR i IN 1..8 LOOP vPassword := vPassword || SUBSTRING(chars, ceil(random()*LENGTH(chars))::integer, 1); END LOOP; END LOOP; return vPassword; END; $BODY$ LANGUAGE plpgsql; 如果你没有在这种情况下使用返回的值,那么行为将是相同的和更清晰的。

答案 1 :(得分:2)

整个表达式正在执行,其值转换为boolean

($var = testfunction($param1, $param2))

首先,将调用testfunction(...),之后将进行分配。根据{{​​3}}:

  

赋值表达式的值是指定的值。

因此返回并分配给$var的任何内容都将转换为布尔值并由WHILE循环进行评估。如果指定的值为null,[],0等,则不会执行while循环中的代码块。否则它将被执行。

答案 2 :(得分:0)

while函数在调用函数运行且其返回值分配给$var后,对$var的值执行类型强制转换为布尔值。因此,如果函数返回一个计算结果为FALSE的值,则while循环存在,否则它将为此迭代运行其代码块。

php documentation准确显示哪些值评估为false,请参阅以下列表:

  

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

     

布尔值FALSE本身

     

整数0(零)

     

浮点数0.0(零)

     

空字符串,字符串“0”

     

零元素的数组

     

一个零成员变量的对象(仅限PHP 4)

     

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

     

从空标签创建的SimpleXML对象

     

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