If you’ve been writing PHP for a while, you probably remember the days of nested „isset()” checks cluttering up every template and controller. Since PHP 7, there’s a much cleaner way — and if you haven’t fully embraced it yet, it’s worth a second look.
The null coalescing operator (??) returns the left operand if it exists and isn’t null, otherwise the right. No warnings, no notices, no ceremony.
1 2 3 4 5 6 7 8 9 | <?php // The old way — verbose and easy to get wrong $username = isset($_GET['user']) ? $_GET['user'] : 'guest'; // With null coalescing — same behavior, far less noise $username = $_GET['user'] ?? 'guest'; // It chains too, which is where it really shines $config = $userConfig['theme'] ?? $siteConfig['theme'] ?? 'default'; |
PHP 7.4 took it a step further with the null coalescing assignment operator (??=), which only assigns if the variable is currently null or unset:
1 2 3 4 5 6 7 8 9 | <?php $options = ['timeout' => 30]; // Only set 'retries' if it isn't already defined $options['retries'] ??= 3; $options['timeout'] ??= 60; // stays 30 — already set print_r($options); // Array ( [timeout] => 30 [retries] => 3 ) |
One subtle thing to keep in mind: ?? only reacts to null or unset — not to falsy values like „0″, „””, or „false”. That’s usually what you want, but it’s a meaningful difference from the older ?: (Elvis) operator, which falls back on any falsy value.
1 2 3 4 5 | <?php $count = 0; echo $count ?? 10; // prints 0 — because 0 is not null echo $count ?: 10; // prints 10 — because 0 is falsy |
Small syntax, big quality-of-life improvement. If your codebase still has rows of „isset()” ternaries, refactoring them is one of those low-risk cleanups that pays off every time someone reads the file next. 🐘