PHP 7.4: как проверить, что типизированное свойство инициализировано?

В пхп 7.4 если мы пытаемся получить доступ к типизированному свойству, которому не засетано значение, всё падает с ошибкой.

Стоит задача - проверить, иницилаизированно ли свойство объекта каким-то значением, включая null.

class A
{
    private ?string $typed;

    public function isTypedInitialized(): bool
    {
        // ???
    }
}


как это сделать? isset возвращает false для null, в итоге мы не можем понять, то ли оно не инициализированно, то ли инициализированно наллом.

Если вдруг интересно, зачем такое нужно - для кеширования. Если свойство проинициализированно, значит данные закешировались и мы берем их из кеша. Если в нем налл, значит повторно пытаться получить данные из источника не нужно - так как этот налл из источника и пришел.
  • Вопрос задан
  • 304 просмотра
Решения вопроса 1
Skiphog
@Skiphog
Crutch developer
Ещё такой вариант сработает ))
public function isTypedInitialized(): bool
{
    return (new ReflectionProperty($this, 'typed'))
        ->isInitialized($this);
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Audiophile
@Audiophile Автор вопроса
Нашел вариант, но это дикость...

public function isTypedInitialized(): bool
{
        try {
            $this->typed;
            return true;
        } catch (Error $e) {
            return false;
        }
}


Тем более что ошибка общая бросается, не специфическая
Ответ написан
@Bone
Еще как вариант использовать класс:
class StringValue
{
    public ?string $value;
    
    public function __construct(?string $value)
    {
        $this->value = $value;
    }
}


И потом вместо
private ?string $typed;
Использовать
private ?StringValue $typed;
Ответ написан
Комментировать
@Vitsliputsli
Кеширование отдельных свойств звучит как дикость. Но есть похожая задача, нужно знать какие свойства объекта были изменены, для этого при изменении поля, оно фиксируется в отдельном, специальном массиве.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 18:38
1500 руб./в час
19 апр. 2024, в 18:36
1500 руб./за проект
19 апр. 2024, в 18:36
30000 руб./за проект