1.什么是命名空间?
什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。
2.命名空间有什么用?
(1)防止用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
(2)为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
3.命名空间在tp5中的作用?
采用命名空间方式定义和自动加载类库文件,有效的解决了多模块和Composer
类库之间的命名空间冲突问题,并且实现了更加高效的类库自动加载机制。
如果你需要调用PHP内置的类库,或者第三方没有使用命名空间的类库,记得在实例化类库的时候加上 \,例如:
// 错误的用法
$class = new stdClass();
$xml = new SimpleXmlElement($xmlstr);
// 正确的用法
$class = new \stdClass();
$xml = new \SimpleXmlElement($xmlstr);
注意:命名空间只对类、函数和用const定义的常量起作用,define定义的会报错。真实的命名空间只是虚拟的目录,而在tp中只是很巧妙的把它转化成了真实的路径。
4.命名空间的三种访问方式
(1) 非限定名称访问
(2) 限定名称访问
(3) 完全限定名称访问
实例说明:
1 <?php 2 namespace beijing\haidian\*; 3 4 class Animal{ 5 public $obj='dog'; 6 static $name='wangwang'; 7 8 } 9 10 function getmsg() 11 { 12 echo '北京海淀'; 13 } 14 15 16 namespace shanghai\putuo\mingzhu; 17 18 class Animal{ 19 public $obj='pig'; 20 static $name='hengheng'; 21 } 22 23 function getmsg() 24 { 25 echo '上海普陀'; 26 } 27 28 //非限定名称访问,没有指定命名空间,默认使用最近的命名空间 29 getmsg(); //此处直接调用函数,输出的将会是 上海普陀 30 31 //限定名称访问 32 mingzhu\getmsg(); 33 //限定名称访问有点类似于相对路径,此时寻找函数时,会在原本的命名空间下来找。 34 //此时要找的getmsg()是shanghai\putuo\mingzhu\mingzhu\getmsg() 35 36 //完全限定名称访问 37 \beijing\haidian\*\getmsg(); //完全限定名称访问最前边都会有一个\,此时会在全局搜索类似绝对路径 38 //输出北京海淀
5.命名空间的引用和引用空间类
1 <?php 2 namespace beijing\haidian\*; 3 4 class Animal{ 5 public $obj='dog'; 6 static $name='wangwang'; 7 8 } 9 10 function getmsg() 11 { 12 echo '北京海淀'; 13 } 14 15 16 namespace shanghai\putuo\mingzhu; 17 18 class Animal{ 19 public $obj='pig'; 20 static $name='hengheng'; 21 } 22 23 function getmsg() 24 { 25 echo '上海普陀'; 26 } 27 28 29 $a=new Animal(); 30 echo $a->obj; 31 32 /*我们先实例化这个动物类,访问他的成员属性obj 此时输出的是 pig*/ 33 //但是如果我们要访问最顶端的动物类的成员属性要怎么办呢,就要使用完全限定名称访问 34 $b=new \beijing\haidian\*\Animal; 35 echo $b->obj; //此处会输出dog 36 37 /**由此引出一个问题,当命名空间的级别很多时,我们要调用的时候就会相当繁琐,解决办法就是引入空间**/ 38 use beijing\haidian\*; 39 getmsg(); //此时调用会输出什么的呢,居然是上海普陀,为什么不是北京海淀呢 40 //这是因为在引入空间之后,如果我们想要访问这个空间下的函数、类等,必须用限定名称的方式 41 *\getmsg(); //此时会输出北京海淀 42 43 //调用类 44 $c=new *\Animal(); 45 echo $c->obj; //输出dog 46 47 /*此时你会发现一个问题,调用类时还得必须用限定名称访问的模式,还是麻烦,有没有更简单的方法呢
6.引入空间类
1 <?php 2 namespace beijing\haidian\*; 3 4 class Animal{ 5 public $obj='dog'; 6 static $name='wangwang'; 7 8 } 9 10 function getmsg() 11 { 12 echo '北京海淀'; 13 } 14 15 16 namespace shanghai\putuo\mingzhu; 17 18 19 function getmsg() 20 { 21 echo '上海普陀'; 22 } 23 24 25 //引入空间类 26 use beijing\haidian\*\Animal; 27 //之后可以直接使用 28 $a=new Animal(); 29 echo $a->obj; //此处输出dog 30 echo Animal::$name; //此处输出wangwang