使用命名空间
和使用文件类似,命名空间的使用可以通过相对路径形式和绝对路径形式。
命名空间的基本用法
PHP 命名空间中的元素使用和操作系统中的文件路径类似,类名可以通过三种方式引用:
- 非限定名称,或不包含前缀的类名称,例如
$a=new foo();
或foo::staticmethod();
。如果当前命名空间是currentnamespace
,foo
将被解析为currentnamespace\foo
。如果使用foo
的代码是全局的,不包含在任何命名空间中的代码,则foo
会被解析为foo
。 - 限定名称,或包含前缀的名称,例如
$a = new subnamespace\foo()
; 或subnamespace\foo::staticmethod();
。如果当前的命名空间是currentnamespace
,则foo
会被解析为currentnamespace\subnamespace\foo
。如果使用foo
的代码是全局的,不包含在任何命名空间中的代码,foo
会被解析为subnamespace\foo
。 - 完全限定名称,或包含了全局前缀操作符的名称,例如,
$a = new \currentnamespace\foo()
; 或\currentnamespace\foo::staticmethod();
。在这种情况下,foo
总是被解析为代码中的文字名(literal name)currentnamespace\foo
。
<?php
namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo()
{
echo 'funfoo1' . "\n";
;
}
class foo
{
public static function staticmethod()
{
echo 'classfoo1' . "\n";
}
}
namespace Foo\Bar;
const FOO = 2;
function foo()
{
echo 'foo2' . "\n";
}
class foo
{
public static function staticmethod()
{
echo 'class2' . "\n";
}
}
/* 非限定名称 */
foo();
foo::staticmethod();
echo FOO;
/* 限定名称 */
subnamespace\foo();
subnamespace\foo::staticmethod();
echo subnamespace\FOO;
/* 完全限定名称 */
\Foo\Bar\foo();
\Foo\Bar\foo::staticmethod();
echo \Foo\Bar\FOO;
别名及导入
在PHP中,导入和使用别名都是用过use
实现的,例如:
<?php
namespace foo;
use My\Full\Classname as Another;
use My\Full\NSname;
use My\Full\Classname as Another, My\Full\NSname;
全局空间
如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀 \
表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。
<?php
namespace A\B\C;
/* 这个函数是 A\B\C\fopen */
function fopen() {
/* ... */
$f = \fopen(...); // 调用全局的fopen函数
return $f;
}