为什么我不能在没有完整命名空间的情况下从字符串中实例化新对象

时间:2018-01-04 15:20:07

标签: php reflection namespaces

为什么我想从像这样的字符串中实例化一个新对象

use Foo\Bar\Test

$name = "Test";
$test = new $name();

我收到异常,因为在全局命名空间中找不到Test。 我知道在实例化时我可以简单地使用完整的命名空间:

$name = "Foo\\Bar\\Test";
$test = new $name();

但它有点不适合我计划用它做的用途。我知道这可能是我“不适合”的设计缺陷,但它仍然提出了为什么不能这样做的问题。此外,如果存在,是否有替代方法? (在__NAMESPACE__旁边,如本例所示,我目前不在Foo\Bar)。

1 个答案:

答案 0 :(得分:3)

您必须区分信息,编译器在编译时和运行时解析。在编译时,他解决了别名解析。

use Foo\Bar\Test

因此Test的每次出现都会被解析为\Foo\Bar\Test

创建 new 对象是一种运行时操作。此时,没有任何别名或命名空间解析。运行时(new运算符)此时唯一知道的是给定名称。如果您传递一个类,它必须始终是完全限定名称。