导航

ThinkPHP 关于namespace的事儿

Posted on 2016-05-08 23:02  SRBlackBird  阅读(816)  评论(0编辑  收藏  举报

  如题,php通常是不允许函数重名的,例如a.php中有一个getName(),b.php中有一个getName(),在require_once a.php和b.php后就会报getName重复定义的错误。改错误可以通过rename函数名来解决,或者通过namespace来解决。看下面的代码:

 

 1 <?php
 2 
 3 function getName(){
 4   echo 'getName 111';  
 5 }
 6 
 7 function getName(){
 8   echo 'getName 222';  
 9 }
11 
12 ?>

这个代码是会报错函数重复定义错误的。可以通过下面的方式修改

 

 1 namespace t1;
 2   function getName(){
 3     echo 'getName 111';  
 4   }
 5   
 6 namespace t2;
 7   function getName(){
 8     echo 'getName 222';  
 9   }
10 
11 echo getName();
12 echo t1\getName();
13 echo \t1\getName();

 

通过命名空间 t1和t2来隔离getName函数,在下面的echo getName()会执行t2的getName函数,因为这种输出会查找最近的namespace的对于函数。

echo t1\getName()会报错,因为程序会查找最近的namespace,也就是真正执行的是 echo \t2\t1\getName()这个,在t2下没有t1\getName所以报错。

echo \t1\getName()执行t1的getName方法。

 上面还可以通过use namespace的方式来解决

将echo t1\getName()修改为 

use t1;

echo getName()也能解决问题。

 

在来看下面一段代码

 

 1 namespace t1;
 2 class Person{
 3   function getName(){
 4     return "t1.person.name";
 5   }    
 6 }
 7 
 8 namespace t2;
 9 class Person{
10   function getName(){
11     return "t2.person.name";
12   }
13 } 
14 
15 use t1\Person;
16 Person::getName();

 在最后Person::getName()时会发生错误,提示Person已经定义不能重复定义。原因是use t1\Person;把t1的Person类引入到了当前最近的namespace t2中,但是t2中已经存在Person类了,因此发生冲突,产生错误。解决办法如下

use t1\Person as Per;

Per::getName();

该代码使用as关键字,将引入的t1名称空间下的Person类重名命成了Per因此避免了和t2下的Person发生冲突。