PHP中命名空间的由来
命名空间是PHP5.3以后才有的,这个概念在C#中很早就有了,PHP中的命名空间概念其实和C#中的是一样的。
什么是命名空间
从广义上来说,命名空间是一种封装事物的方法,在很多地方都可以见到这种概念,例如:在操作系统中,目录用来将文件分组,对于目录中的文件来说,它就扮演了命名空间的角色;
举个例子:文件foo.txt可以同时存在 /home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个foo.txt文件,另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分割符放在文件名之前得到 /home/greg/foo.txt 。这个原理应用到程序设计领域就是明明空间的概念。
命名空间元素访问方式:
非限定名称:
限定名称
完全限定名称
<?php namespace henan; function cesi(){ echo '河南'; } namespace shandong; function cesi(){ echo '山东'; } cesi(); //非限定名称,直接访问命名空间shandong下的cesi(),输出山东 henan\cesi(); //限定名称,尝试访问命名空间shandong\henan下的cesi(),由于不存该命名空间,会报错。 \henan\cesi(); //完全限定名称,直接访问命名空间hean下的cesi(),输出河南 ?>
命名空间的引入
<?php namespace zhongguo\henan; function cesi(){ echo '河南'; } namespace meiguo\niuyue; function cesi(){ echo '纽约'; } class People{ static $name = 'Peter'; } namespace zhongguo\shandong; function cesi(){ echo '山东'; } class People{ static $name = '山西人'; } use meiguo\niuyue; \meiguo\niuyue\cesi(); //输出 纽约 niuyue\cesi(); //输出 纽约 echo \meiguo\niuyue\People::$name; //输出 Peter use meiguo\niuyue\People; echo People::$name; //由于山西中也存在People类,且其中也包含静态属性$name,这是就会发生冲突,系统就会报错。 //解决方案 use meiguo\niuyue\People as Pe; echo Pe::$name; //系统输出Peter; //以下这种访问方式会访问到山西的People类中的属性 use meiguo\niuyue; echo People::$name; //输出 山西人 ?>
引入文件没有命名空间,访问外部文件里的函数或方法
common.php
<?php function cesi(){ echo '台湾'; } class People{ static $name = '台湾人'; } ?>
运行文件test.php
<?php namespace zhongguo\henan; function cesi(){ echo '河南'; } include("./common.php"); namespace zhongguo\shandong; function cesi(){ echo '山东'; } class People{ static $name = '山东人'; } \cesi(); //会访问外部引入的公共命名空间,输出 台湾 echo \People::$name; //会访问外部引入的公共命名空间,输出 台湾人 ?>
运行文件没有命名空间,引入外部文件里包含命名空间
test.php
<?php function cesi(){ echo '台湾'; } include("./common.php"); class People{ static $name = '台湾人'; } zhongguo\henan\cesi(); //访问外部引入文件的zhongguo\henan命名空间下的cesi(),输出 河南 \zhongguo\henan\cesi(); //这种方式也可以访问外部引入文件的zhongguo\henan命名空间下的cesi(),输出 河南 ?>
common.php
<?php namespace zhongguo\henan; function cesi(){ echo '河南'; } namespace zhongguo\shandong; function cesi(){ echo '山东'; } ?>
注意事项:
命名空间只对类、函数、常量起作用
声明命名空间的当前脚本第一个命名空间前面不能有任何代码(注释除外)
命名空间是虚拟的抽象空间,不是真的存在目录