以下是样本:
if(($test = array('key'=>true)) && $test['key']){
// works
}
if($test = array('key'=>true) && $test['key']){
// does not work
}
为什么需要括号?我的理解是它计算第一个条件,然后计算第二个条件,无论如何。
做这样的作业是否“安全”?
答案 0 :(得分:8)
这是语言operator precedence的问题。在你的第二个陈述中,你基本上是在写这个以进行评估:
$test = array('key'=>true) && $test['key'];
几乎任何语言都可以理解为:
$test = (array('key'=>true) && $test['key']);
它正在为$test
分配两个其他值之间的逻辑&&
的评估值。因此,$test
在评估时将为true
或false
。
答案 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条件。