一文搞懂php的命名空间是什么

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自带的函数。

留言

您的电子邮箱地址不会被公开。