Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么可以';从没有完整名称空间的字符串实例化新对象_Php_Reflection_Namespaces - Fatal编程技术网

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现在看起来很明显。我想我更想找一个工作,但我想现在是时候回顾一下我的设计了。多谢。