新しいレイジープロキシインスタンスを作成する

# ReflectionClass::newLazyProxy

(PHP 8 >= 8.4.0)

ReflectionClass::newLazyProxy — 新しいレイジープロキシインスタンスを作成する

### 説明

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

クラスの新しいレイジープロキシインスタンスを作成し、 `factory` をアタッチします。コンストラクタは呼び出されず、 プロパティはデフォルト値に設定されません。プロキシの状態を 初めて参照または変更する時に、 ファクトリ関数により実インスタンスが初期化され、 プロキシにアタッチされます。その後、プロキシとのすべての対話は 実インスタンスに転送されます。 初期化トリガーおよび 初期化シーケンス を参照してください。

### パラメータ

`factory`
  ファクトリは以下のシグネチャを持つコールバックです:

  function factory(object `$object`): object
  `object`
    初期化される`object`。この時点では、 オブジェクトはもはやレイジーとしてマークされておらず、 アクセスしても再び初期化がトリガーされることはありません。
  ファクトリ関数は、実インスタンスとして参照される オブジェクトを返す必要があり、それがプロキシにアタッチされます。 この実インスタンスはレイジーであってはならず、 プロキシ自体でもあってはなりません。もし実インスタンスが プロキシと同じクラスでない場合、プロキシのクラスは実インスタンスのクラスの サブクラスでなければならず、追加のプロパティを持ってはならず、 __destruct()や__clone()メソッドを オーバーライドしてはいけまさん。
`options`

  `options`には以下のフラグを組み合わせて 指定できます:

  `ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE`
    デフォルトでは、レイジーオブジェクトのシリアライズは 初期化がトリガーされます。このフラグを設定すると、 初期化せずにシリアライズできるようになります。

### 戻り値

レイジープロキシインスタンスを返します。オブジェクトにプロパティがない場合、または そのプロパティがすべてstaticまたはvirtualの場合、通常の（レイジーではない）インスタンスが 返されます。 レイジーオブジェクトの ライフサイクルも参照してください。

### エラー / 例外

クラスが内部クラスであるか、stdClassを除く内部クラスを 拡張している場合、Errorをスローします。

### 例

例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