在if语句中设置变量的问题

时间:2010-12-30 20:03:59

标签: php

以下是样本:

if(($test = array('key'=>true)) && $test['key']){
    // works
}
if($test = array('key'=>true) && $test['key']){
    // does not work
}

为什么需要括号?我的理解是它计算第一个条件,然后计算第二个条件,无论如何。

做这样的作业是否“安全”?

5 个答案:

答案 0 :(得分:8)

这是语言operator precedence的问题。在你的第二个陈述中,你基本上是在写这个以进行评估:

$test = array('key'=>true) && $test['key'];

几乎任何语言都可以理解为:

$test = (array('key'=>true) && $test['key']);

它正在为$test分配两个其他值之间的逻辑&&的评估值。因此,$test在评估时将为truefalse

答案 1 :(得分:0)

使用是安全的,但在这种情况下,需要括号来消除歧义。 PHP的operator precedence规则意味着第二行将执行为:

if ($test = (array('key' => true) && $test['key'])) { .. }

所以测试不是一个阵列而是一个布尔。

在if语句中进行赋值的做法本身并不是真正鼓励可读性,所以你可能想避免这样做太多。

答案 2 :(得分:0)

我不认为PHP中需要这些内容。他们在JS。

取决于你所说的“安全”。有用。但是有些人认为这是糟糕的风格,并且使得代码不易理解且维护较少。 otoh,K& R积极推荐它。它不会让我担心,有时会使代码更加整洁。

答案 3 :(得分:0)

这是因为它迫使解释器在尝试评估if中的任何条件之前执行赋值。

如果没有括号,您只需将array('key'=>true) && $test['key']的结果分配给$ test。

答案 4 :(得分:0)

在PHP中,赋值运算符=的优先级低于大多数其他运算符。 (有关更多信息,请参阅documentation)。此外,使用赋值运算符的表达式的结果是赋值的值。考虑到这一点,请考虑您发布的表达式:

第一个例子:
($test = array('key'=>true)) && $test['key'] 此表达式的第一部分($test = array('key'=>true))评估为array('key'=>true)(按照上述规则),第二部分评估为true,因为密钥刚刚设置。因此整个表达式的评估结果为true

第二个例子:
$test = array('key'=>true) && $test['key']根据运算符优先级规则,$test将被赋予表达式array('key'=>true) && $test['key']的值。上半部分是正确的,但$test['key']尚未设置,因此true && false为false,因此$test取值false,这也是结果if条件。