Php 使用`new$className()`实例化一个类是否存在任何问题?我是否应该使用它而不是“ReflectionClass::newInstance”?

Php 使用`new$className()`实例化一个类是否存在任何问题?我是否应该使用它而不是“ReflectionClass::newInstance”?,php,reflection,Php,Reflection,有时候,在处理服务容器之类的东西时,我必须实例化一个类,但我从配置文件中获取完整的类名。例如,与symfony容器非常相似: myService: class: "Vendor\Namespace\ClassName" arguments: [...] 现在,在我的容器中,我有一个选择:我可以使用下面的代码段实例化这个类,它利用了这个PHP奇怪的特性,在运行时评估类名: $service = new $className(...$evaluatedArguments); 或者

有时候,在处理服务容器之类的东西时,我必须实例化一个类,但我从配置文件中获取完整的类名。例如,与symfony容器非常相似:

myService:
    class: "Vendor\Namespace\ClassName"
    arguments: [...]
现在,在我的容器中,我有一个选择:我可以使用下面的代码段实例化这个类,它利用了这个PHP奇怪的特性,在运行时评估类名:

$service = new $className(...$evaluatedArguments);
或者我可以使用反射来实例化它:

$reflectionClass = new \ReflectionClass($className);
$service = $reflectionClass->newInstance($evaluatedArguments);
后者更清楚地说明了它在做什么,目前是我首选的方法。但是,由于$className不是用户输入(从作为应用程序配置文件的.yaml文件加载),因此除了可读性之外,我找不到不使用第一个代码段的理由

它看起来非常粗略,但我想不出任何不使用它的技术/安全原因,而且它确实节省了一些内存(我不必实例化\ReflectionClass),而且更不冗长

我的问题是:使用
new$className
是否存在任何问题


免责声明,因为我知道人们喜欢脱离主题:我不是在构建服务容器。不要建议我使用Pimple或其他DiC而不是解决这个问题,这只是一个用于教学目的的示例。

new$className()
用于实例化具有变量名的类。时期它起作用了。没有任何警告。没有理由为简单的对象实例化调用
ReflectionClass
的开销。

transpiler(如facebook的HPHPc)如何处理这种奇怪的功能?C++检查类在编译时是否是实例化的(与PHP在运行时相反),这样的语法糖肯定会破坏兼容性,对吧?我的意思是,我不打算使用HPHPc或其他任何东西,但如果你仔细想想,从技术上讲,这是不使用反射的一个很小的缺点。HPC不赞成使用HHVM。但同样的问题也适用于JIT编译器如何处理这个问题?我不知道。这是PHP官方支持的功能。如果其他PHP实现选择不支持它,那就是他们的问题。无论他们编译成什么语言,都是非常不相关的,如果实现者选择这样或那样的方式,有一些方法可以处理。不要迷失在技术细节中。问题是:您选择的运行时是否支持这种语法?到目前为止,我一直在使用反射来实例化所有东西。我想你刚刚说服我不要这么做。我想现在是重构的时候了。非常感谢。