ReflectionClass::newLazyProxy

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

説明

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

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

パラメータ

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

object factory(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