我见过很多在线代码,它有一个函数为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
等同于真。
这些是我的推论,虽然我没有找到任何背后的文件,但我的分析可能是错的。
答案 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(包括任何资源)。