php的命名空间的作用是防止命名冲突。命名具体的说就是类、函数、常量、接口。主要使用两个关键字use , namespace。对于define ( 定义一个常量)是不起作用的。
首先看一个示例,这里使用常量作为示例,类和函数都一样。
# Author: www.phpjiaocheng.com
<?php
namespace you;
const MYCONST = 1; # 该定义在命名空间 you 中
namespace my;
const MYCONST = 2; # 该定义在命名空间 my 中。
echo MYCONST ; // 2 # 当前还是在吗命名空间 my 中
echo \my\MYCONST; // 2
echo \you\MYCONST; // 1 # 当前的命名空间是 my , 想使用you命名的空间的MYCONST, 就写全, 开头的 \ 表示
namespace 用来定义一个命名空间,必须在代码文件的一行(除declare 语句外)。前四行定义两个常量,名字一样。后三句进行输出。可以看到同样的名字在不同的命名空间中,就像同样的文件名,在不同的目录一样。这就是命名空间的作用。
命名空间使用 \ 进行分割,可以有子命名空间。类似目录用 / 进行分割,有子目录类似。
虽然可以在同一个文件中使用多个命名空间,强烈建立不要这么做。如果需要使用大括号语法的形式,代码更清晰。
命名空间的作用范围
在一个文件中只要使用了 namespace 指定一个命名空间,之后的代码中定义的类、函数、接口都在该命名空间下。
# Author: www.phpjiaocheng.com
<?php
namespace you {
const MYCONST = 2;
}
namespace {
const MYCONST = 1;
echo MYCONST;
echo \you\MYCONST;
}
// 下面代码导致语法错误,命名空间采用大括号语法,则代码必须写在命名空间中
// echo \you\MYCONST;
命名空间中的 非限定、限定、完全限定的使用方法
非限定方式访问: 类似 的当前目录下访问当前目录下的文件,前面不加路径。
限定方式访问:类似 要访问的文件是不在当前的目录,但是文件的位置和当前的位置有关系,需要添加一个前缀。
完全限定方式访问: 类似 不管文件在哪里,从根目录开始访问。
实际使用的时候,一个命名空间就是一个文件,下面的代码可以想象为三个文件。
# Author: www.phpjiaocheng.com
<?php
namespace my\test\two;
const MYCONST = 3;
namespace my;
const MYCONST = 1;
echo MYCONST; // 输出1 非限定访问
echo test\two\MYCONST; //输出3 限定, 相对于完全限定方式来说,不用写前面的 \my
namespace my\test;
const MYCONST = 2;
echo \my\MYCONST; // 输出1 完全限定访问
use 的用法,导入命名空间,获取使用别名
# Author: www.phpjiaocheng.com
<?php
namespace A\A\A;
const a = 1;
class Aclass {
public function __construct() {
echo "Aclass";
}
}
namespace B;
const b = 2;
namespace C;
const c = 3;
# 命名空间太长了,可以来个 “快捷方式”
use A\A\A as A;
echo A\a; # 输出 1
echo "\n";
use B as b;
echo b\b; # 输出: 2
echo "\n";
# 直接导入类, 直接使用类
use A\A\A\Aclass as ac;
(new ac());
echo "\n";
# 导入命名空间C下的内容
use C;
echo c; # 输出3
全局空间
类和函数没有在命名空间中定义,那么这些类和函数就在全局空间中,可以直接使用。比如php自带的函数。