什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。
- 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
- 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
命名空间语法示例
<?php
namespace my\name; // 参考 "定义命名空间" 小节
class MyClass {}
function myfunction() {}
const MYCONST = 1;
$a = new MyClass;
$c = new \my\name\MyClass; // 参考 "全局空间" 小节
$a = strlen('hi'); // 参考 "使用命名空间:后备全局函数/常量" 小节
$d = namespace\MYCONST; // 参考 "namespace操作符和__NAMESPACE__常量” 小节
$d = __NAMESPACE__ . '\MYCONST';
echo constant($d); // 参考 "命名空间和动态语言特征" 小节
?>
Note:
名为PHP或php的命名空间,以及以这些名字开头的命名空间(例如PHP\Classes)被保留用作语言内核使用,而不应该在用户空间的代码中使用。
- namespace App\main;
- class aa {
- public static function test() {
- echo 1;
- }
- }
- namespace App\test;
- class aa {
- public static function test() {
- echo 2;
- }
- }
- <?php
- require 'main.class.php';
- require 'test.class.php';
- App\main\aa::test();
- App\test\aa::test();
2、个类名都是aa ,当在一个文件里调用的时候,通过命名空间,就不会报错。
定义子命名空间
(PHP 5 >= 5.3.0, PHP 7)
与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:
Example #1 声明分层次的单个命名空间
<?php
namespace MyProject\Sub\Level;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>
上面的例子创建了常量MyProject\Sub\Level\CONNECT_OK,类 MyProject\Sub\Level\Connection和函数 MyProject\Sub\Level\connect。
2.命名空间的三种访问方式
1)非限定名称访问
访问的元素前面不包含前缀,即访问当前定义的元素。
2)限定名称访问
访问的元素包含前缀名称,简单理解使用虚拟目录的相对路径访问方式
3)完全限定名称访问
访问的元素包含全局的命名空间前缀,理解为使用虚拟目录的绝对路径访问
举例说明:
- <?php
- namespace app1\pro1\item1; //命名空间前不能有有效代码
- header("content-type:text/html;charset=utf-8");
- function func(){
- echo "func1";
- }
- const x = "name1";
- class Fruit{
- public $a = '苹果1';
- static $b = '菠萝1';
- }
- namespace app2\pro2\item2\topic2;
- function func(){
- echo "func2";
- }
- const x = "name2";
- class Fruit{
- public $a = '苹果2';
- static $b = '菠萝2';
- }
- namespace app2\pro2;
- function func(){
- echo "func3";
- }
- const x = "name3";
- class Fruit{
- public $a = '苹果3';
- static $b = '菠萝3';
- }
- // 非限定名称访问,访问当前定义的元素
- func(); //输出“func3”
- echo x; //name3
- $fruit = new Fruit;//实例化类
- echo $fruit->a; //苹果3
- echo Fruit::$b; //菠萝3
- // 限定名称访问,访问当前定义元素下面的item2\topic2路径下的元素
- item2\topic2\func(); //输出“func2”
- echo item2\topic2\x; //name2
- $fruit = new item2\topic2\Fruit;//实例化类
- echo $fruit->a; //苹果2
- echo item2\topic2\Fruit::$b; //菠萝2
- //完全限定名称访问
- \app1\pro1\item1\func(); //输出“fun1”
- echo \app1\pro1\item1\x; //name1
- $fruit = new \app1\pro1\item1\Fruit;//实例化类
- echo $fruit->a; //苹果1
- echo \app1\pro1\item1\Fruit::$b; //菠萝1