为什么我想从像这样的字符串中实例化一个新对象
use Foo\Bar\Test
$name = "Test";
$test = new $name();
我收到异常,因为在全局命名空间中找不到Test
。
我知道在实例化时我可以简单地使用完整的命名空间:
$name = "Foo\\Bar\\Test";
$test = new $name();
但它有点不适合我计划用它做的用途。我知道这可能是我“不适合”的设计缺陷,但它仍然提出了为什么不能这样做的问题。此外,如果存在,是否有替代方法? (在__NAMESPACE__
旁边,如本例所示,我目前不在Foo\Bar
)。
答案 0 :(得分:3)
您必须区分信息,编译器在编译时和运行时解析。在编译时,他解决了别名解析。
use Foo\Bar\Test
因此Test
的每次出现都会被解析为\Foo\Bar\Test
。
创建 new 对象是一种运行时操作。此时,没有任何别名或命名空间解析。运行时(new
运算符)此时唯一知道的是给定名称。如果您传递一个类,它必须始终是完全限定名称。