使用 `new $className()` 实例化一个 class 是一个问题吗?我应该使用它而不是 `ReflectionClass::newInstance` 吗?

Is instantiating a class using `new $className()` an issue by any means? Should I use it instead of `ReflectionClass::newInstance`?

有几次,在处理服务容器之类的东西时,我必须实例化一个 class,但我从配置文件中获得了完整的 class 名称。一个例子,很像 symfony 容器:

myService:
    class: "Vendor\Namespace\ClassName"
    arguments: [...]

现在,在我的容器中,我有一个选择:我可以使用下面的代码片段实例化这个 class,它利用了这个 PHP 评估class 运行时名称:

$service = new $className(...$evaluatedArguments);

或者我可以使用反射实例化它:

$reflectionClass = new \ReflectionClass($className);
$service = $reflectionClass->newInstance($evaluatedArguments);

后者更清楚它在做什么,目前是我的首选方法。但是,由于 $className 不是用户输入(从用作应用程序配置文件的 .yaml 文件加载),除了可读性之外,我找不到不使用第一个代码段的理由。

它看起来很粗略,但我想不出任何 technical/security 不使用它的理由,而且它 确实 节省了一些内存(我不必须实例化一个 \ReflectionClass) 并且不那么冗长。

我的问题:使用 new $className 是一个问题吗?

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

new $className()officially supported PHP syntax 用于实例化具有变量名称的 class。时期。有用。没有警告。没有理由为简单的对象实例化调用 ReflectionClass 的开销。