如何解决在 PHP 8 ReflectionAttribute 类中使用的 newInstance 方法速度快,占用空间小吗?
在 PHP 8 中,引入了类 ReflectionAttribute。它类似于Java中的注解,Typescripts等。那么每次你想使用一个属性的属性时,你必须这样做:
$attributeReflection = ...;
...
$attribute = $attributeReflection->newInstance();
$message = $attribute->getMessage();
其中 $attributeReflection 是 ReflectionAttribute 的一个实例。并且属性本身如下:
#[Attribute(Attribute::ALL)]
class MyAttribute{
public function __construct(
public ?string $message = ''
){}
}
并且如下用于属性
class Foo{
#[MyAttribute("my message")
public ?string $id = null;
}
如您所见,每次我想要获取属性的消息时,我都必须创建它的一个新实例。虽然在这种情况下消息永远不会改变。
我正在寻找一种避免新实例并使用共享实例的方法。
有可能吗?
解决方法
似乎还没有人为 ReflectionAttribute
类编写文档,但您可以看到 a summary in the feature proposal for Attributes,其中列出了它的方法:
class ReflectionAttribute
{
public function getName(): string { ... }
public function getArguments(): array { ... }
public function newInstance(): object { ... }
}
这里的关键是你可以在不调用构造函数的情况下访问参数——事实上,属性名称甚至不需要是一个有效的类名,因为它不会被自动加载,直到 { {1}} 被调用。
因此,在您的示例中,您可以简单地说 newInstance
,或者编写一个自定义工厂来合并具有相同消息的实例等。
另一方面,请注意过早优化:只有在分析告诉您这实际上是您的应用程序中的重大成本时,才花时间使优化变得更加复杂。您很可能会发现反射本身比这个构造函数调用的成本高得多,并决定在构建脚本中运行整个过程,将运行时所需的信息保存到某种缓存中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。