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