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