if语句中的评估和分配

时间:2015-02-03 18:31:18

标签: php

我想知道,这适用于任何主要的PHP版本吗?

if ($foo != $bar && '' != $str = some_function($some_variable))
    echo $str;

some_function($some_variable)返回一个字符串,该字符串分配给$str变量,然后检查是否为空字符串。 $str变量当然会在以后使用。

在每个主要PHP版本(> 5)中分配给some_function变量的$str的输出是什么?我无法找到有关此信息的任何信息。感谢。

我目前正在运行5.4并且正在运行。

编辑:为避免进一步混淆,$foo != $bar位于另一个表达式之前,因为$str变量仅在if语句中使用。对不起,我忘了澄清一下。

3 个答案:

答案 0 :(得分:4)

是的它确实有效,但为了让它像你想要的那样工作,你必须在赋值周围加上括号,因为比较的优先级高于赋值! (operator precedence

如果$foo != $bar为false,$str永远不会初始化,所以也要更改顺序,以便随时分配。

所以使用这个:

if ('' !== ($str = some_function($some_variable)) && $foo != $bar)
     //^^^ ^ See here                   And here^
     //| '!==' to also check the type

答案 1 :(得分:2)

我不明白为什么这不适用于任何PHP版本(> 5)。 在此测试:http://sandbox.onlinephpfunctions.com/code/a295189c50c191bbd0241d4e8ea4e3081cdb40ae

使用4.4.9及更高版本的所有版本。

注意:因为您正在使用&&运算符,&& amp;之后的代码如果$ foo!= $ bar已经返回false,则不会运行,因为第二个表达式不能改变&&的结果运算符,因此它会忽略它。

如果分配意图始终发生,则更改表达式的顺序。

if ('' != $str = some_function($some_variable) && $foo != $bar)
    echo $str;

答案 2 :(得分:1)

为什么不用括号和花括号来表达清楚而不是混淆。例如:

if (($foo != $bar) && '' != ($str = some_function($some_variable)) ) {
       echo $str;
}