【发布时间】:2016-09-28 08:52:46
【问题描述】:
由于特征实际上是我所期望的复制/粘贴代码:
__NAMESPACE__
提供使用它的类的命名空间。
不幸的是,对我来说,它似乎提供了 trait 的命名空间。
这是为什么?
【问题讨论】:
-
“由于特征实际上是复制/粘贴代码...”不,它们不是。
-
@KaloyanDoichinov 谢谢,这似乎是一种不完全准确的概念化方法!
由于特征实际上是我所期望的复制/粘贴代码:
__NAMESPACE__
提供使用它的类的命名空间。
不幸的是,对我来说,它似乎提供了 trait 的命名空间。
这是为什么?
【问题讨论】:
__NAMESPACE__ 包含编写__NAMESPACE__ 出现的代码的名称空间。它具有“字面范围”,只要该概念适用于此。在其他命名空间中调用的函数或在其他命名空间中实例化的对象也是如此;它们都引用了自己的原始命名空间,而不是当前运行代码的命名空间。
命名空间实际上只是影响名称,标识符。出于所有意图和目的:
namespace Foo\Bar;
class Baz {}
只是以下的简写:
class Foo\Bar\Baz {}
就所有意图和目的而言,它等同于:
class Foo_Bar_Baz {}
命名空间不会在运行时解析,也不会对运行时产生任何实际影响,它们只是为名称添加前缀,同时仍然允许使用较短的语法,而不必经常编写很长的名称。
__NAMESPACE__指的是当前实体的“名称前缀”,如上面的Foo_Bar;不多也不少。
【讨论】:
您是从 trait 本身内部的方法的上下文中调用它,因此返回 trait 的命名空间是完全合乎逻辑的。
如果您实际上是在询问如何获取类的命名空间,请查看 here。
【讨论】: