PHP 8.6.0 Beta 1 is available for testing

ReflectionClass::newLazyProxy

(PHP 8 >= 8.4.0)

ReflectionClass::newLazyProxyСоздает новый экземпляр ленивого прокси

Описание

public function ReflectionClass::newLazyProxy(callable $factory, int $options = 0): object

Метод создаёт новый ленивый прокси-экземпляр класса и прикрепляет к ленивому прокси фабричную callback-функцию factory. Конструктор не вызывается, а свойствам не устанавливаются значения по умолчанию. При попытке наблюдения или модификации состояния объекта-прокси в первый раз вызывается фабричная функция, чтобы вернуть реальный экземпляр, который затем прикрепляется к прокси. Взаимодействия с прокси после этого этапа перенаправляются в реальный экземпляр. См. секции руководства «Триггеры инициализации» и «Последовательность инициализации».

Список параметров

factory
Фабрика — callback-функция со следующей сигнатурой:

function factory(object $object): object
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)
 }
}

Смотрите также

Нашли ошибку?

ИнструкцияИсправлениеСообщение об ошибке
+Добавить

Примечания пользователей

Пользователи ещё не добавляли примечания для страницы

AltStyle によって変換されたページ (->オリジナル) /