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