为什么我不能在没有完整命名空间的情况下从字符串中实例化新对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我不能在没有完整命名空间的情况下从字符串中实例化新对象相关的知识,希望对你有一定的参考价值。

当我想从字符串中实例化一个新对象时,为什么呢?

use FooBarTest

$name = "Test";
$test = new $name();

我得到一个例外,因为在全局命名空间中找不到Test。我知道在实例化时我可以简单地使用完整的命名空间:

$name = "Foo\Bar\Test";
$test = new $name();

但它有点不适合我计划用它做的用途。我知道这可能是我“不适合”的设计缺陷,但它仍然提出了为什么不能这样做的问题。此外,如果存在,是否有替代方法? (在__NAMESPACE__旁边,就像在这个例子中我目前不在FooBar)。

答案

您必须区分信息,编译器在编译时和运行时解析。在编译时,他解决了别名解析。

use FooBarTest

所以Test的每一次出现都将被解决为FooBarTest

而是创建新对象是运行时操作。此时,没有任何别名或命名空间解析。运行时(new操作符)此时唯一知道的是给定名称。如果传递类,则必须始终为完全限定名。

以上是关于为什么我不能在没有完整命名空间的情况下从字符串中实例化新对象的主要内容,如果未能解决你的问题,请参考以下文章

错误:检测到“站点”没有命名空间,但没有目标命名空间的组件不能从架构文档中引用

有没有办法在 iOS 中标记文件,这样它们就不会在存储空间不足的情况下从 Library/Caches 目录中清除

如何在不指定完整命名空间的情况下使用 OData(7.4) .Net Core 过滤枚举列表?

如何在没有“可选”的情况下从 plist 打印字符串?

如何在没有 Composer 作为依赖项(PSR-0)的情况下使用具有命名空间的 PHP 库?

如何在没有 SMTP 的情况下从 PHPMAILER 发送电子邮件