1. 命名空间概述
什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。
2. 定义命名空间
语法:<?php
namespace 命名空间名;
?>
特点:
1. namespace 需要PHP 5.3 +
2. namespace 前面不允许任何的输出流代码(除了namespace自己),
它的作用范围 到下一个namespace开始 或 脚本结束
3. namespace只对本脚本起作用
4. 文件如果没有定义命名空间,则默认在全局命名空间之中
3. 定义子命名空间
namespace aaa\bbb\ccc;
?>
4. 在同一个文件中定义多个命名空间
1. 不推荐 一般一个文件中 定义一个命名空间
2. 万不得已 建议使用 {} 进行定界
5. 使用命名空间:基础
1. 非限定名称
直接调用函数/类型/常量,没有命名空间成分
2. 限定名称
就是使用时,有命名空间成分,但不以反斜线开头的. 类似于相对路径
3. 完全限定名称
以反斜线开头的, 又有命名空间成分的. 类似于绝对路径
6. 命名空间 和 动态语言特征
如果把 函数名/类名/常量名 赋值给变量去动态使用的话
在命名空间里 `必须` 写完全限定名称
注意: 在命名空间字串里 必须使用单引号包裹,不解析转义字符
7. namespace关键字和__NAMESPACE__常量
* namespace 关键字
声明命名空间
用来简化调用
* __NAMESPACE__ 常量
获取本命名空间的名字
PS.
::class
自 PHP 5.5 起,关键词 class 也可用于类名的解析。使用 ClassName::class 你可以获取一个字符串,包含了类 ClassName 的完全限定名称。这对使用了 命名空间 的类尤其有用。
8. 使用命名空间:别名/导入
别名<?php
use 命名空间 [as 别名];
?>
导入
use 命名空间\类名;
只能导入类
9. 全局空间
相当于 没有定义命名空间时的效果