Why is the operator ?? sheer misfortune?
PHP users have been waiting for the
?? operator for an
incredibly long time, perhaps ten years. Today, I regret that it took
- Wait, what? Ten years? You're exaggerating, aren't you?
- Really. Discussion started in 2004 under the name “ifsetor”. And it didn't make it into PHP until December 2015 in version 7.0. So almost 12 years.
- Aha! Oh, man.
It's a pity we didn't wait longer. Because it doesn't fit into the current PHP.
PHP has made an incredible shift towards strictness since 7.0. Key moments:
- introducing scalar types (which were approved just barely)
- nullity (since 7.1,
nullbecame important, replacing the earlier
- abolish dynamic properites (the definitive end of old PHP)
?? operator simplified the annoying:
isset($somethingI[$haveToWriteTwice]) ? $somethingI[$haveToWriteTwice] : 'default value'
$write[$once] ?? 'default value'
But it did this at a time when the need to use
greatly diminished. Today, we more often assume that the data we access exists.
And if they don't exist, we damn well want to know about it.
?? operator has the side effect of being able to detect
null. Which is also the most common reason to use it:
$len = $this->length ?? 'default value'
Unfortunately, it also hides errors. It hides typos:
// always returns 'default value', do you know why? $len = $this->lenght ?? 'default value'
In short, we got
?? at the exact moment when, on the contrary,
we would most need to shorten this:
$somethingI[$haveToWriteTwice] === null ? 'default value' : $somethingI[$haveToWriteTwice]
It would be wonderful if PHP 9.0 had the courage to modify the behavior of
?? operator to be a bit more strict. Make the “isset
operator” really a “null coalesce operator”, as it is officially called by
PHPStan and checkDynamicProperties:
true helps you to detect typos suppressed by the