In PHP 5.3, a shorter syntax for the ternary operator was introduced, which allows to leave out the middle part of the ternary operator for a quick shorthand evaluation. It has the following syntax:
// PHP 5.3+ expr1 ?: expr2;
This shorthand syntax is also referred to as the elvis operator (?:
). Note that all of the following statements are equivalent:
// using the elvis operator expr1 ?: expr2;
// using the ternary operator expr1 ? expr1 : expr2;
// using if/else if (expr1) { return expr1; } else { return expr2; }
The statements above translate to; if expr1 evaluates to true
, return expr1, otherwise return expr2. This means that, if a falsy value is encountered, the elvis operator will return the second operand, and if a truthy value is encountered, the first operand (i.e. the truthy value) will be returned.
Note that when the left hand side of the elvis operator evaluates to true
, the right hand side of the expression is not evaluated. This is because of short-circuiting — which means the second operand is executed / evaluated only if the first operand does not evaluate to true
.
Ternary Chaining
One useful feature of the elvis operator is that you can use it to chain ternaries, for example, like so:
echo 0 ?: 1 ?: 2 ?: 3; // output: 1
In such a case first truthy value it encounters is returned. This is the same as writing a series of if
/ elseif
/ else
statements, for example, like so:
if (expr1) { return expr1; } else if (expr2) { return expr2; } else if (expr3) { return expr3; } else { return expr4; }
Similarities With Other Languages
In certain programming languages (such as Perl, Python, Ruby, and JavaScript), the elvis operator is written as the OR operator (typically ||
or or
). This has the same behavior, i.e. returning its first operand if it evaluates to true
, or evaluating and returning its second operand otherwise.
This post was published by Daniyal Hamid. Daniyal currently works as the Head of Engineering in Germany and has 20+ years of experience in software engineering, design and marketing. Please show your love and support by sharing this post.