tp5中命名空间的应用

时间:2022-09-08 09:13:33

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