Ternary nuances in PHP

Yesterday while working on one of my projects, I came across a weird scenario: a very simple statement written in PHP was not behaving the way it should.

Below is the simplified version of the code I was working with:

1
2
$i = 1;
echo $i == 1 ? 'One' : $i == 2 ? 'Two' : 'Three';

At first glance, it is obvious that the output of the above code should be ‘One‘, but the output here is ‘Two‘.

After RTFM, I came to know that PHP recommends that we avoid “stacking” ternary expressions. PHP’s behaviour when using more than one ternary operator within a single statement is non-obvious. The above expression will be evaluated as following:

1
2
3
4
5
6
7
8
// a more obvious version of the same code as above
$i = 1;
echo ($i == 1 ? 'One' : $i == 2) ? 'Two' : 'Three';
 
// here, you can see that the first expression is
// evaluated to 'true', which in turn evaluates to
// 'One', thus returning the true branch of the
// second ternary expression.

Correct representation that produces the expected result is:

1
2
$i = 1;
echo $i == 1 ? 'One' : ($i == 2 ? 'Two' : 'Three');

I wonder why developers would leave a feature in the langauge that is ambiguous or not obvious. Has to be a very good reason. But this scenario is a rare one, at least I stumbled across (or noticed) this case for the first time.

Have you come across any other such nuance in PHP?

• • •

One Response to Ternary nuances in PHP

  1. Thanks for ur explanation of how simple things can get complicated.