php - 为什么我不能从没有完整命名空间的字符串实例化新对象

标签 php reflection namespaces

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

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/

相关文章:

PHP自定义div并排放置

java - 对存储在 var 中的 Java 类调用静态方法

c++ - C++ 中同名的 C 结构体和 C 函数

C++ : Is Namespaces definition allowed before '#include <files>' .

namespaces - 如何使用命名空间访问类成员?

php - 获取使用 "group by"检索的正确行值

php - 防止使用PHP注入(inject)SQL

php - 为什么我的 mySQL 查询不起作用?

java - 在 Java 中从 "Simple Class Name"转换为 "Full Class Name"到对象的最佳方法

scala - 如何在 Scala 中使用反射获取所有(非最终)对象 val 和子对象 val?