在PHP8 ReflectionAttribute类中使用newInstance方法速度快且占用空间小吗?

在PHP8 ReflectionAttribute类中使用newInstance方法速度快且占用空间小吗?,php,php-8,Php,Php 8,在PHP8中,引入了类ReflectionAttribute。它类似于Java中的注释、Typescripts等。例如,每当您想要使用属性的属性时,您必须执行以下操作: $attributeReflection=。。。; ... $attribute=$attributeReflection->newInstance(); $message=$attribute->getMessage(); 其中$attributeReflection是ReflectionAttribute的一个实例。属性本

在PHP8中,引入了类ReflectionAttribute。它类似于Java中的注释、Typescripts等。例如,每当您想要使用属性的属性时,您必须执行以下操作:

$attributeReflection=。。。;
...
$attribute=$attributeReflection->newInstance();
$message=$attribute->getMessage();
其中$attributeReflection是ReflectionAttribute的一个实例。属性本身如下所示:

#[属性(属性::全部)]
类MyAttribute{
公共函数构造(
公共?字符串$message=“”
){}
}
并用于以下属性

class-Foo{
#[MyAttribute(“我的消息”)
public?字符串$id=null;
}
正如你所看到的,每次我想要得到属性的消息时,我都必须创建一个新的实例,而在这种情况下,消息永远不会改变

我正在寻找一种方法来避免新实例,并使用共享实例


有可能吗?

看起来还没有人为
ReflectionAttribute
类编写文档,但是您可以看到,其中列出了它的方法:

class ReflectionAttribute
{
公共函数getName():字符串{…}
公共函数getArguments():数组{…}
公共函数newInstance():对象{…}
}
这里的关键是,您可以在不调用构造函数的情况下访问参数-实际上,属性名甚至不需要是有效的类名,因为在调用
newInstance
之前,它不会自动加载

因此,在您的示例中,您可以简单地说
$message=$attributeReflection->getArguments()[0]
,或者编写一个自定义工厂来合并具有相同消息的实例,等等

另一方面,要注意过早的优化:如果分析告诉您这实际上是应用程序中的一项重大成本,则只需花费时间使其更加复杂。您可能会发现反射本身的成本比构造函数调用的成本高得多,并决定在构建脚本中运行整个过程,从而节省信息需要在运行时将数据写入某种缓存