正文
初衷
PHP 命名空间可以解决以下两类问题:
用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
定义命名空间
默认情况下,所有常量、类和函数名都放在全局空间下。
命名空间通过关键字namespace 来声明。
<?php
namespace MyProject;
// ... 代码 ...
如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。
在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。
举例:
<?php
declare(encoding='UTF-8'); //定义多个命名空间和不包含在命名空间中的代码
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace { // 全局代码
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
命名空间使用
PHP 命名空间中的类名可以通过三种方式引用:
1、非限定名称,或不包含前缀的类名称,例如 $a=new foo();
或 foo::staticmethod();
。
如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespace\foo
。
如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。
警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。
2、限定名称,或包含前缀的名称,例如 $a = new subnamespace\foo();
或 subnamespace\foo::staticmethod();
。
如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo
。
如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo
。
3、完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo();
或 \currentnamespace\foo::staticmethod();
。
在这种情况下,foo 总是被解析为代码中的文字名(literal name) currentnamespace\foo
。
可以把非限定名称类比为文件名(例如 comment.php
),限定名称类比为相对路径名(例如 ./article/comment.php
),
完全限定名称类比为绝对路径名(例如 /blog/article/comment.php
),这样可能会更容易理解。
<?php
namespace Blog; // 创建空间Blog
class Comment { }
// 非限定名称,表示当前Blog空间
// 这个调用将被解析成 Blog\Comment();
$blog_comment = new Comment();
// 限定名称,表示相对于Blog空间
// 这个调用将被解析成 Blog\Article\Comment();
$article_comment = new Article\Comment(); // 类前面没有反斜杆\
// 完全限定名称,表示绝对于Blog空间
// 这个调用将被解析成 Blog\Comment();
$article_comment = new \Blog\Comment(); // 类前面有反斜杆\
// 完全限定名称,表示绝对于Blog空间
// 这个调用将被解析成 Blog\Article\Comment();
$article_comment = new \Blog\Article\Comment(); // 类前面有反斜杆\
?>
<?php
namespace Blog\Article; // 创建Blog的子空间Article
class Comment { }
参考资料
PHP 命名空间(namespace) https://www.runoob.com/php/php-namespace.html
PHP命名空间(Namespace)的使用详解 https://www.runoob.com/w3cnote/php-namespace-intro.html
PHP命名空间(Namespace)的使用详解 https://www.cnblogs.com/kuyuecs/p/3556421.html