ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 命名空间 命名空间(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; ?> ```