When building applications, performing comparisons is very common. Recent PHP versions improved the good old "if-else" with a few shorter syntax options.
The ternary operator is used to shorten the if/else.
Instead of writing this:
if (request()->has('customer_id')) { return request()->get('customer_id');} else { return null;}
You can write this:
request()->has('customer_id') ? request()->get('customer_id') : null
This ternary operator can be shortened using the "Elvis" "?:" operator.
request()->get('customer_id') ?: null
In this case, the returned value will be from the request or null.
The null coalescing operator has been available since PHP 7.0. This operator is beneficial for arrays and assigning defaults when a variable is not set.
$username = $user->username ?? 'Anonymous';
In this example, if the username isn't set, the $username will be set to Anonymous.
Also, the null coalesce can be chained. Then, the first set will be returned.
Example from a Laravel Excel package:
src/Concerns/Exportable.php:
$headers = $headers ?? $this->headers ?? [];$fileName = $fileName ?? $this->fileName ?? null;$writerType = $writerType ?? $this->writerType ?? null;
In short, null coalescing is shorter than doing isset() in a ternary operator.
$result = $var ?? 'default';// is a shorthand for$result = isset($var) ? $var : 'default';
In PHP 7.4, a new operator ??= was added. It assigns value to a variable if it is null. Otherwise, it does nothing.
$username ??= 'Anonymous';
If the $username variable wasn't set anywhere else in your code only then it will be set to Anonymous.
PHP 8 introduced a new syntax called the null safe operator, which provides an optional chaining feature.
Instead of writing this:
$order = Order::latest()->first();$invoiceNumber = null; if ($order != null) { if ($order->invoice != null) { $invoiceNumber = $order->invoice->number; }}
Since PHP 8, you can write this:
$order = Order::latest()->first();$invoiceNumber = $order?->invoice?->number;
The null safe operator and null coalescing operator are very similar. The null coalescing operator is useful when assigning a default value instead of a null.
$invoiceNumber = $order->invoice->number ?? 'Invoice number not set';
The null safe operator and the null coalescing operator can be used together.
$invoiceNumber = $order?->invoice->number ?? 'Order not found';
If an order is null, the default value set by the null coalescing operator will be assigned to a $invoiceNumber variable.
The null safe operator is only for reading data. You cannot assign values.
$order?->invoice?->number = 'ABC123';