版本(PHP 5 >= 5.3.0, PHP 7)
命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。
在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
- 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
- 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
<?php namespace chengdu; function getName(){ return "chengdu"; } namespace nanchong; function getName(){ return "nanchong"; } //示例 //非限定名称 echo getName(); //输出nanchong 找命令空间最近的函数,没有会报错 //限定名称 echo chengdu\getName() //报错,相对定位找nanchong\chengdu\getName() 不存在 //完全限定名称 echo \chengdu\getName() // 绝对定位,输出chengdu //命名空间针对:函数、类名、常量三者其作用,在命名空间里面把这三种统称为元素
子空间使用
<?php namespace sichuan\chengdu; function getName(){ return "chengdu"; } namespace sichuan\nanchong; function getName(){ return "nanchong"; } namespace sichuan\mianyang; function getName(){ return "mianyang"; } echo getName(); //输出 mianyang echo sichuan\nanchong\getName() ; //报错,会找sichuan\mianyang\nanchong\getName() echo \sichuan\nanchong\getName() ; //输出nanchong 使用完全限定 ?>
别名和导入
namespace chengdu; function getName(){ return "chengdu"; } class Person { static $name = "chengduren"; } namespace nanchong; function getName(){ return "nanchong"; } namespace mianyang; function getName(){ return "mianyang"; } //第一种使用: use chengdu\Person; //引入chendu空间内的Person类元素 echo Person::$name; //输出chengduren //第二种使用: use chengdu; echo chengdu\getName() //输出chengdu echo chengdu\Person::$name; //输出chengduren
<?php namespace sichuan\chengdu; function getName1(){ return "chengdu"; } class Person { static $name = "chendduren"; } namespace sichuan\nanchong; function getName2(){ return "nanchong"; } class Person { static $name = "nanchongren"; } //只引入空间 use sichuan\chengdu; echo chengdu\getName1(); echo chengdu\Person::$name; //引入空间和元素 use sichuan\chengdu\Person; echo Person::$name; //报错因为最近空间和引入的空间有相同的类 #修改 use sichuan\chengdu\Person as pon; echo pon::$name; //输出chendduren