在PHP中,命名空间提供了一种将相关的类、函数和常量组合到一起的途径。下面直接通过实例练习命名空间的使用:
定义命名空间
#1 不使用命名空间且使用相同函数名称:
代码获取报错如下:
Fatal error: Cannot redeclare funcName()
#2 使用命名空间后正常执行:
与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义。
#3 声明分层次的单个命名空间
注意,定义命名空间前不可有任何输出,否则报错;
#4 定义命名空间前输出数据
以上代码报错:
Fatal error: Namespace declaration statement has to be the very first statement in the script
额外注意:使用define()函数定义相同名称的常量,即使使用命名空间同样会报错。
#5 使用define()函数定义常量:
代码获取报错如下:
Notice: Constant A already defined
#6 使用const方式定义常量既不会报错:
所以得出结论,尽量使用 const 定义常量的方法;
访问命名空间
PHP 命名空间与文件系统访问一个文件的方式一样,通过三种方式引用,分别是非限定名称、限定名称、完全限定名称。同样的,通过栗子说明该三种方式的差异。
#1 非限定名称
namespace space1;const A='atong';namespace space2;const A='fan';echo A; # fan
例子中的 A 相当于 space2/A ;
#2 限定名称
echo space1\A; # Undefined constant 'space2\space1\A'
例子中的space1\A相当于space2\space1\A;
#3 完全限定名称:
echo \space1\A; #atong
例子中的\space1\A相当于space1\A; 结论:与路径的使用方法几乎一样一样的,习惯上会使用完全限定名称的方式出错的几率会低一些。
use
#1 额外介绍一下关于空间引入,也就是 use 的使用,这方便我们使用命名空间
namespace a\b\c\d;const A='atong';namespace space2;const A='fan';echo A; #fanuse a\b\c\d;echo d\A; #atong
#2 空间类元素的引入,与空间引入差不多:
公共空间
如果没有使用到限定命名空间即为公共空间,但在命名空间下include一公共空间会有说明结果呢?例子说明 #1 创建1.php,输入代码,即作为公共空间:
#2 创建2.php,输入代码
此时,在2.php三种方式中输出的结果:
echo A; //atongecho \A; //fanecho B; //ab
结论:命名空间不影响引入的公共空间的内容(A),需要访问公共空间的元素需要使用完全限定名称方式(\A),如果访问命名空间中的元素不存在,及前往公共空间中访问(B);
其实命名空间需要结合文件命名规则才能实现我们类库的自动加载,之后再详细记录吧,以上是命名空间全部内容。
THE END
领取专属 10元无门槛券
私享最新 技术干货