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(object $object): object
object
正在初始化的$object。此时,对象不再被标记为延迟,并且访问它不会再次触发初始化。

工厂函数必须返回一个对象,称为真实实例,然后将其附加到代理。这个真实实例不能是延迟的,也不能是代理本身。如果真实实例与代理的类不同,则代理的类必须是真实实例类的子类,没有额外的属性,并且不能覆盖__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