(PHP 8 >= 8.4.0)
ReflectionClass::newLazyProxy — Создает новый экземпляр ленивого прокси
Метод создаёт новый ленивый прокси-экземпляр класса и прикрепляет к ленивому прокси
фабричную callback-функцию factory
. Конструктор не вызывается,
а свойствам не устанавливаются значения по умолчанию. При попытке
наблюдения или модификации состояния объекта-прокси в первый раз
вызывается фабричная функция, чтобы вернуть реальный экземпляр,
который затем прикрепляется к прокси. Взаимодействия с прокси
после этого этапа перенаправляются в реальный экземпляр. См. секции руководства
«Триггеры инициализации»
и «Последовательность инициализации».
factory
object
object
принимает объект инициализации. На этом этапе
объект перестаёт быть ленивым, а обращение к объекту не запускает
повторную инициализацию.
options
Параметр options
принимает комбинацию следующих
флагов:
ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE
Метод возвращает экземпляр ленивого прокси. Метод возвращает стандартный, а не ленивый экземпляр, если у объекта нет свойств или все свойства объекта статические или виртуальные. Смотрите также описание, которое содержит секция «Жизненный цикл ленивых объектов».
Метод выбросит ошибку Error, если класс окажется внутренним или расширяет внутренний класс, если только это не класс stdClass.
Пример #1 Базовый пример создания нового экземпляра ленивого прокси
<?php
class Example
{
public function __construct(public int $prop)
{
echo __METHOD__, "\n";
}
}
$reflector = new ReflectionClass(Example::class);
$object = $reflector->newLazyProxy(function (Example $object) {
$realInstance = new Example(1);
return $realInstance;
});
var_dump($object);
var_dump($object instanceof Example);
// Запускает инициализацию и перенаправляет обращение к свойству на реальный экземпляр
var_dump($object->prop);
var_dump($object);
?>
Результат выполнения приведённого примера:
lazy proxy object(Example)#3 (0) { ["prop"]=> uninitialized(int) } bool(true) Example::__construct int(1) lazy proxy object(Example)#3 (1) { ["instance"]=> object(Example)#4 (1) { ["prop"]=> int(1) } }