我使用 PHP 已经很长时间了,但现在开始尝试新的语言功能,例如命名空间。我有一个关于自动加载的问题,但在网络搜索中找不到足够的答案。
假设我在不同的命名空间中有类:
namespace foo\bar\baz;
class Quux
{
}
namespace fred\barney\wilma;
class Betty
{
}
然后假设我有一个自动加载器,它假定命名空间和目录结构之间存在 1:1 映射:
function autoload ($className)
{
$className = str_replace ('\\', DIRECTORY_SEPERATOR, $className);
include ($className . 'php');
}
spl_autoload_register ('autoload');
完全限定的命名空间是否在所有情况下都会传递给自动加载器,或者自动加载器是否需要考虑当前正在使用的命名空间?
例如,如果我执行以下操作:
$a = new \foo\bar\baz\Quux;
$b = new \fred\barney\wilma\Betty;
自动加载器应该可以正常工作。
但如果我执行以下操作怎么办?
use \foo\bar\baz as FBB;
$a = new Quux;
$b = new \fred\barney\wilma\Betty;
当尝试实例化新的 Quux 时,自动加载器是否仍会得到\foo\bar\baz\Quux
作为类名参数?或者应该得到FBB\Quux
,或者甚至只是Quux
?
如果是后者,我可以使用以下命令从自动加载器中确定该类应该位于的命名空间吗__NAMESPACE__
或者其他一些这样的机制?
自动装载机将得到foo\bar\baz\Quux
作为类名参数。
命名空间名称定义
不合格名称
这是一个标识符
没有命名空间分隔符,例如 Foo
合格名称
这是一个带有命名空间分隔符的标识符,例如
作为 Foo\Bar
完全限定名称
这是带有命名空间分隔符的标识符
以名称空间分隔符开头,例如 \Foo\Bar。
namespace\Foo 也是一个完全限定名称。
规则是:
所有非限定名称和限定名称(非完全限定名称)都是
根据当前导入规则在编译期间进行翻译。为了
例如,如果命名空间 A\B\C 被导入为 C,则对 C\D\e() 的调用为
翻译为 A\B\C\D\e()。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)