Ternary and Ternary Coalescing Operator in PHP

Published On2020-05-26

PHP supports various forms of ternary and coalescing operators. This is a quick post to catch-up to all ternary and coalescing operators supports in PHP.

1. Ternary Operator: cond ? expr1 : expr2

Ternary operator is a short form for an if/else block that executes exactly one expression each.

if ($marks >= 50) {
    $rank = 'pass';
}
else {
    $rank = 'fail';
}

The if/else block above is quite verbose and consumes more space for a simple expression. With the ternary operator, you can optimize this:

- if ($marks >= 50) {
-   $rank = 'pass';
- }
- else {
-   $rank = 'fail';
- }
+ $rank = $marks >= 50 ? 'pass' : 'fail';

Its syntax is follows:

result = condition ? expression-if-true : expression-if-false

PHP will execute condition condition, and if it evaluates to "true-ish" value (same semantics as an if() condition), value from expression-if-true is used. If condition evaluates to false, value from expression-if-false will be used.

An ideal use case of Ternary operator would be assignments that can have two values.

From PHP 8.0+, you can also throw an exception from a Ternary operator.

2. Shorthand Ternary Operator: cond ?: else-expr

Certain Ternary operator expressions can be simplified further. Consider the following Ternary expression:

$user = load_user() ? load_user() : false;

If the conditional expression is the same as the true-expression, it is possible to reduce this further:

- $user = load_user() ? load_user() : false;
+ $user = load_user() ?: false;

If load_user() function returns a false-ish value, $user will be assigned false. Otherwise, the return value of load_user() will be assigned.

Its syntax is:

result = cond ?: expression-if-false

The cond condition will be evaluated as if it's in an if() block, and the return value will be assigned to result if it is a truthy value. If it's a false-ish value (such as 0, "0", false, null, [], etc), the expression-if-false expression will be evaluated, and its return value will be assigned to result.

3. Null Coalescing Operator

Null Coalescing Operator provides a shorthand for isset() calls. It is often used to reduce excessive isset() calls. Null Coalescing operator calls isset() on the conditional expression, and the value will be returned.

- $result = isset($_GET['value']) ? $_GET['value'] : 'foo';
+ $result = $_GET['value'] ?? 'foo';

If $_GET['value'] is set (which behaves exactly the way isset() does), $_GET['value'] value will be assigned to $result. If it is not set, or null, foo will be assigned to $result.

result = variable ?? expression

PHP calls isset(variable), and variable will be assigned to result if variable is set. If it is not set, expression will be evaluated, and its value will be assigned to result.

4. Null Coalescing Assignment operator

Null Coalescing operator can be be further reduced in PHP 7.4, with Null Coalescing Assignment operator .

- $value = $value ?? 'foo';
+ $value ??= 'foo';

A word of caution

Be mindful when you chain ternary/coalescing operators. It is now required to use braces to make the intent clear if you absolutely have to use ternary/coalescing operators.

Null Coalescing Assignment operator is relatively new in PHP (added in PHP 7.4), so you code might not work in older PHP versions if you decide to use that operator.

These operators are syntax sugar only, and do not provide any meaningful performance difference compared to good ol' if/else blocks. When the intent is not clear, it is recommended to go with if/else blocks although they make the code slightly verbose

Recent Articles on PHP.Watch

All ArticlesFeed
PHP's new convention on using namespaces for extensions

PHP's new convention on using namespaces for extensions

A recent RFC passed in favor of using a namespace for PHP extensions.
How to compile PHP from source on Debian/Ubuntu - Beginner's guide

How to compile PHP from source on Debian/Ubuntu - Beginner's guide

Beginner's guide to compile PHP from the source, on Ubuntu/Debian with up to date instructions for PHP 8 and up.
Function Inlining in Zend Engine

Function Inlining in Zend Engine

A list of special PHP functions that Zend Engine can inline and optimize.
Subscribe to PHP.Watch newsletter for monthly updates

You will receive an email on last Wednesday of every month and on major PHP releases with new articles related to PHP, upcoming changes, new features and what's changing in the language. No marketing emails, no selling of your contacts, no click-tracking, and one-click instant unsubscribe from any email you receive.