php & Typed property $var must not be accessed before initialization

Пхп местами странноватый язык который странновато эволюционирует.

$a = new class {
    public readonly object $b;
    public readonly object $c;

    public function __construct() {
        $this->b = new class {
            public function helloworld() {
                return 'hello world';
            }
        };
    }
};

Вот если у нас есть объект в котором есть 2 проперти, одно из которых инициализировано, а другое нет.

С инициализированным проперти всё просто и понятно:

echo $a->b?->helloworld(); // hello world

А вот если вы так же сделаете для неинициализированного то оно умрёт:

echo $a->c?->helloworld(); // Typed property class@anonymous::$c must not be accessed before initialization

Неудобно когда умирает поэтому приходится делать дополнительную проверку:

if (isset($a->c)) {
   echo echo $a->c->helloworld();
}

Ещё более неудобно когда хочешь проверить есть ли какой-то объект и проверить что-то в этом объекте, то начинается…

if (isset($a->c) && $a->c->isValid()) {
   return true;
}

По непонятно причине ?-> умирает если оно неиницилизовано и не заменяет isset(), а вот ?? не умирает и вполне себе живёт и заменяет isset() поэтому…

echo ($a->c ?? null)?->helloworld();
if (($a->c ?? null)?->isValid()) {
   return true;
}

Какой же ад, нравится!

#php

2024.12.10 18:01