命名空间解决了一个命名的问题。试想一下,两个程序员都写了一个函数,不凑巧的是,他们的给函数起的名字是一样的。这样程序就就没法区别该用那个函数了。命名空间就是用来解决这样的问题的。php的命名空间可以解决三种命名的冲突。分别是 类、函数 和 const 定义的常量。需要注意的是没有变量和define定义的常量。
相关的常量和关键字
常量或者关键字 | 含义 |
---|---|
NAMESPACE | 编译时候的一个常量,表示当前的命名空间 |
namespace | 指定当前行,下面的代码,使用的是那个命名空间。 一个文件中可以有多个命名空间,多个文件也可以共用一个命名空间 |
use | 导入别名,相当于起个别名 |
一个简单的示例
file: a.php
<?php
namespace myname;
function f() {
echo __FUNCTION__;
}
file: test.php
<?php
include "a.php";
myname\f();
#\myname\f();
输出的结果是 myname\f
可以看到,在命名空间下的函数,的名字里是包含命名空间的名字。
命名空间介绍
如果使用命名空间,比如写在代码的第一条,并且之前不能有输出。
错误的示例
<html>
<?php
namespace myname;
一个命名空间可以用在多个文件中,这样多个文件就公用了一个命名空间。在同一个命名空间下的函数、类、常量之间可以直接使用。不需要用 \来指定命名空间。都是当前的命名空间。
同一个命名空间的示例
<?php
namespace myname;
function f() {
echo __FUNCTION__;
}
f(); # 不需要指定命名空间。
\myname\f(); # 指定命名空间
# myname\f(); 错误的写法
可以看到有两种写法都是正确的。
如果命名空间过长,怎么缩写书写的长度
这里需要明白两个问题。第一:命名空间的解析规则是什么。第二:使用别名。
解析分为三类 给目录很类似. 非限定的 相当于"当前目录", 完全限定 相当于"绝对路径", 限定名称 相当于 "相对路径"
需要注意的地方
- 命名空间对 define 定义的常量 没有作用
- 对于函数和常量来说,如果当前命名空间中不存在该函数或常量,PHP 会退而使用全局空间中的函数或常量。
- 类存在不一定可以用
程序会报错
namespace myname;
if (class_exists("ArrayObject")) {
new ArrayObject();
}