2024-12-10:
The weird evolution of PHP
PHP is kinda weird-ish language of weird-ish evolution.
$a = new class {
public readonly object $b;
public readonly object $c;
public function __construct() {
$this->b = new class {
public function helloworld() {
return 'hello world';
}
};
}
};
Let's assume you found yourself with 2 properties in an object and only one of them was initialized (thrift times).
Everything is clear with the lucky initialized:
echo $a->b?->helloworld(); // hello world
But if you will do the same with non-initialized property then everything will abrupt:
echo $a->c?->helloworld(); // Typed property class@anonymous::$c must not be accessed before initialization
Not the best expectations fulfillment when there is nothing after so you are forced to check an extra check:
if (isset($a->c)) {
echo echo $a->c->helloworld();
}
And what we want to check something inside this propery right in check?
if (isset($a->c) && $a->c->isValid()) {
return true;
}
No reasonable explanation can explain why ?-> dies if propery wasn't initialized and you have to add isset(), but ?? just doesn't care about property initialization and it's an actual replace for isset(). So..
echo ($a->c ?? null)?->helloworld();
if (($a->c ?? null)?->isValid()) {
return true;
}
Very noice, very butiful!