修复损坏的链式/堆叠php三元运算符

时间:2013-10-15 23:12:45

标签: php coding-style logic conditional-operator

在php中如果你

echo (('a'=='a')?'A':('a'=='b')?'B':'C');

结果将是:

B

总垃圾。根据{{​​3}},这是因为

  

从左到右评估三元表达式。

这对我来说并没有真正解释它:从左到右评估('a'=='a')所以结果是'A',不是!?真的不知道php如何从中获取'B'。这种语句可用于许多语言,但不适用于php。有没有人理解这里的PHP逻辑,以及如何最好地解决这个问题?

2 个答案:

答案 0 :(得分:1)

评估左侧的整个表达式。这些都是一样的:

echo( ('a' == 'a') ? 'A' : ('a' == 'b')  ? 'B' : 'C');
echo((('a' == 'a') ? 'A' : ('a' == 'b')) ? 'B' : 'C');

以下表达式的评估结果为A

('a' == 'a') ? 'A' : ('a'=='b');

此表达评估为B

('A' ? 'B' : 'C');

如果移动括号,表达式将按照您的预期进行评估:

echo(('a' == 'a') ? 'A' : (('a' == 'b') ? 'B' : 'C'));

答案 1 :(得分:0)

实验性地,

echo (('a'=='a')?'A':(('a'=='b')?'B':'C'))

输出

A

看起来php实现已经混乱了operator precedence,使:的优先级高于?,所以没有括号,

('a'=='a')?'A':('a'=='b')

组合在一起,所以表达式为:

('a'=='a')?'A':('a'=='b')?'B':'C'

评估为

('A'?'B':'C');

'B'的结果为'A'0FALSE不是TRUE}。