PHP Conference Japan 2024

ReflectionClass::newLazyProxy

(PHP 8 >= 8.4.0)

ReflectionClass::newLazyProxy建立新的惰性代理實例

說明

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

建立一個新的類別的惰性代理實例,並將 factory 函式附加到它。建構子不會被呼叫,屬性也不會被設定為其預設值。當第一次嘗試觀察或修改代理的狀態時,會呼叫 factory 函式來提供一個真實的實例,然後將其附加到代理。在此之後,所有與代理的後續互動都會轉發到真實的實例。請參閱 初始化觸發器初始化順序

參數

factory
factory 是一個具有以下簽章的回呼函式

factory(object $object): object
object
object 是正在初始化的物件。此時,該物件不再被標記為惰性,並且訪問它不會再次觸發初始化。

factory 函式必須返回一個物件,稱為「真實實例」,然後將其附加到代理。這個真實實例不能是惰性的,也不能是代理本身。如果真實實例與代理沒有相同的類別,則代理的類別必須是真實實例類別的子類別,沒有額外的屬性,並且不得覆寫 __destruct()__clone() 方法。
options

options 可以是以下旗標的組合

ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE
預設情況下,序列化惰性物件會觸發其初始化。設定此旗標可防止初始化,允許惰性物件在未初始化的情況下被序列化。

返回值

返回一個惰性代理實例。如果物件沒有屬性,或者它的所有屬性都是靜態或虛擬的,則返回一個普通的(非惰性)實例。另請參閱 惰性物件的生命週期

錯誤/異常

如果該類別是內部類別或繼承自內部類別(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)
  }
}

另請參閱

新增註解

使用者貢獻的註解

此頁面沒有使用者貢獻的註解。
To Top