(PHP 8 >= 8.4.0)
ReflectionClass::newLazyProxy — Создает новый экземпляр ленивого прокси
Метод создаёт новый ленивый прокси-экземпляр класса и прикрепляет к ленивому прокси
фабричную callback-функцию factory. Конструктор не вызывается,
а свойствам не устанавливаются значения по умолчанию. При попытке
наблюдения или модификации состояния объекта-прокси в первый раз
вызывается фабричная функция, чтобы вернуть реальный экземпляр,
который затем прикрепляется к прокси. Взаимодействия с прокси
после этого этапа перенаправляются в реальный экземпляр. См. секции руководства
«Триггеры инициализации»
и «Последовательность инициализации».
factory
objectobject принимает объект инициализации. На этом этапе
объект перестаёт быть ленивым, а обращение к объекту не запускает
повторную инициализацию.
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)
}
}