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

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

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

- Ленивые объекты
- ReflectionClass::newLazyGhost() - Создаёт новый экземпляр ленивого призрака
- ReflectionClass::newInstanceWithoutConstructor() - Создаёт новый экземпляр класса без вызова конструктора
- ReflectionClass::resetAsLazyProxy() - Сбрасывает и помечает объект ленивым
- ReflectionClass::markLazyObjectAsInitialized() - Помечает ленивый объект как инициализированный без вызова инициализатора или фабрики
- ReflectionClass::initializeLazyObject() - Принудительно инициализирует ленивый объект
- ReflectionClass::isUninitializedLazyObject() - Проверяет, ленив ли и неинициализирован ли объект
- ReflectionProperty::setRawValueWithoutLazyInitialization() - Устанавливает необработанное значение свойства без запуска ленивой инициализации
- ReflectionProperty::skipLazyInitialization() - Помечает свойство как неленивое
- ReflectionProperty::isLazy() - Проверяет, лениво ли свойство

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open