Php 为什么可以';从没有完整名称空间的字符串实例化新对象
为什么当我想从这样的字符串实例化一个新对象时Php 为什么可以';从没有完整名称空间的字符串实例化新对象,php,reflection,namespaces,Php,Reflection,Namespaces,为什么当我想从这样的字符串实例化一个新对象时 use Foo\Bar\Test $name = "Test"; $test = new $name(); 我得到一个异常,因为在全局命名空间中找不到Test。 我知道我可以在实例化时使用完整的名称空间: $name = "Foo\\Bar\\Test"; $test = new $name(); 但它有点不适合我计划使用它。我知道这可能是我的设计缺陷,因为“不适合”,但它仍然提出了一个问题,为什么不能这样做。此外,如果存在,是否有替代方法?(
use Foo\Bar\Test
$name = "Test";
$test = new $name();
我得到一个异常,因为在全局命名空间中找不到Test
。
我知道我可以在实例化时使用完整的名称空间:
$name = "Foo\\Bar\\Test";
$test = new $name();
但它有点不适合我计划使用它。我知道这可能是我的设计缺陷,因为“不适合”,但它仍然提出了一个问题,为什么不能这样做。此外,如果存在,是否有替代方法?(除了本例中的
\uuuu名称空间
之外,我当前不在Foo\Bar
)。您必须区分信息,编译器在编译和运行时解析。在编译时,他解析别名解析
use Foo\Bar\Test
因此,Test
的每一次出现都将被解析为\Foo\Bar\Test
相反,创建新对象是一项运行时操作。此时,没有任何别名或命名空间解析。此时运行时(
new
操作符)唯一知道的就是给定的名称。如果通过类,它必须始终是完整的限定名。注意:Foo\Bar\Test
不是完整的命名空间,\Foo\Bar\Test
是。为什么不能这样做
。猜测一下,use语句是在编译时处理的,您的第二个示例将在运行时确定。@JonStirling现在看起来很明显。我想我更想找一个工作,但我想现在是时候回顾一下我的设计了。多谢。