## 命名空间
命名空间(Namespace)表示标识符(identifier)的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。
简单说来命名空间是为了解决不同库在同一个环境下使用时出现的命名冲突。例如我自己有一个函数名叫 A,但是系统已经有一个 A 函数了,那就会出现冲突。
### 全局空间
如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀 \ 表示该名称是全局空间中的名称。
### 定义命名空间
- 在定义的命名空间之前不能有任何输出。如 html 代码等。
- 在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句,如:declare(encoding='UTF-8');
- 只在文件开头进行命名空间定义,并且只定义一个。
- 通常命名空间要遵循 PSR-0 命名规范(命名空间和目录结构保持一致)。
**注意:** 只有 const, function, class 受命名空间的约束。
文件 foo.php
```
<?php
namespace app\foo;
const E_ERROR = 'foo_error';
function md5($str)
{
return \md5('123'. $str . '123');
}
class Test
{
public function getNamespace()
{
return __NAMESPACE__;
}
}
?>
```
文件 bar.php
```
<?php
namespace app\bar;
const E_ERROR = 'bar_error';
function md5($str)
{
return \md5('abc'. $str . 'abc');
}
class Test
{
public function getNamespace()
{
return __NAMESPACE__;
}
}
?>
```
### 使用命名空间
**元素引用**
命名空间中元素的三种引用方式:
- 非限定名称:访问当前命名空间。(在当前文件中直接使用)
- 限定名称:类似于相对路径,访问当前空间下的子命名空间,如:new People\Person();
- 完全限定名称:类似于绝对路径,访问全局空间,如:new \Person();
**导入/别名**
允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。这有点类似于在类 unix 文件系统中可以创建对其它的文件或目录的符号连接。
在 PHP 中,别名是通过 use 操作符来实现的;
```
<?php
namespace app\test;
use app\foo;
use app\bar as BB;
require 'foo.php';
require 'bar.php';
class Test
{
public function printNamespace()
{
return __NAMESPACE__;
}
}
/*----------- 引用静态变量 ----------- */
echo '全局命名空间下的静态变量:' . \E_ERROR . PHP_EOL;
echo 'app\foo 命名空间下的静态变量:' . foo\E_ERROR . PHP_EOL;
echo 'app\bar 命名空间下的静态变量:' . BB\E_ERROR . PHP_EOL;
/*----------- 引用函数 ----------- */
echo '全局命名空间下的函数:' . \md5('hello') . PHP_EOL;
echo 'app\foo 命名空间下的函数:' . foo\md5('hello') . PHP_EOL;
echo 'app\bar 命名空间下的函数:' . BB\md5('hello') . PHP_EOL;
/*----------- 引用类 ----------- */
$curTest = new Test();
$fooTest = new foo\Test();
$barTest = new BB\Test();
echo '当前命名空间下的方法:' . $curTest->getNamespace() . PHP_EOL;
echo 'app\foo 命名空间下的方法:' . $fooTest->getNamespace() . PHP_EOL;
echo 'app\bar 命名空间下的方法:' . $barTest->getNamespace() . PHP_EOL;
?>
```
- 基本语法
- PHP标记
- 指令分隔符
- 从HTML中分离
- 注释
- 数据类型
- 布尔值
- 整数
- 浮点数
- 字符串
- 数组
- 对象
- 资源
- 空值
- 变量
- 基础
- 预定义变量
- 变量范围
- 可变变量
- 常量
- 常量语法
- 魔术常量
- 运算符
- 算术运算符
- 赋值运算符
- 位运算符
- 比较运算符
- 递增与递减运算符
- 逻辑运算符
- 字符串运算符
- 数组运算符
- 类型运算符
- 流程控制
- if条件结构
- switch条件结构
- while循环结构
- do-while循环结构
- for循环结构
- foreach循环结构
- 包含文件
- 函数
- 自定义函数
- 可变函数
- 匿名函数
- 递归函数
- 类与对象
- 基本概念
- 属性
- 方法
- 类常量
- 构造函数和析构函数
- 访问控制
- 继承
- 抽象类
- 接口
- Trait
- 重载
- 对象遍历
- 魔术方法
- Final关键字
- 命名空间
- 自动加载
- 错误处理
- 错误显示
- 错误日志
- 错误报告
- 自定义错误处理
- 异常处理
- 异常处理机制
- 扩展异常处理类
- 字符操作
- 数组操作
- 时间操作
- 表单操作
- GET提交
- POST提交
- 文件上传
- 会话控制
- COOKIE操作
- SESSION操作
- 文件操作
- 文件属性
- 读取文件
- 写入文件
- 文件管理
- 文件锁
- 目录处理
- 路径处理
- 网络操作
- HTTP协议
- Socket操作
- CURL操作
- PDO操作
- 介绍
- 连接管理
- 预处理语句
- 事务处理
- 错误处理
- 图像操作
- 正则表达式
- 标准推荐
- 包管理器
- 设计模式
- 常用算法
- 安全防御
- XSS防御
- CSRF防御