PHP Conference Japan 2024

ReflectionClass::newLazyProxy

(PHP 8 >= 8.4.0)

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

Описание

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

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

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

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

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)
  }
}

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

Добавить

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

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