一、目的
用户编写的代码与PHP内部的(或第三方框架的)类/函数/常量或第三方类/函数/常量之间的名字冲突。 可以把他理解为文件夹吧。命名空间就是文件夹,里面的文件就是我们的类、常量等。
二、声明命名空间
1.单个命名空间(一个文件中,只有一个命名空间)
<?php namespace MyProject ; const CONNECT_OK = 1 ; class Connection { /* ... */ } function connect () { /* ... */ } ?>
2.分层次的单个命名空间
<?php namespace MyProject \ Sub \ Level ; const CONNECT_OK = 1 ; class Connection { /* ... */ } function connect () { /* ... */ } ?>
3.多个命名空间(一个文件中有多个命名空间,不提倡使用多个命名空间。若要使用,最好用{}的方式,注意这里这两种方式不能混用,否则报: No code may exist outside of namespace {}的错误。即)
<?php declare( encoding = 'UTF-8' ); namespace MyProject { const CONNECT_OK = 1 ; class Connection { /* ... */ } function connect () { /* ... */ } } namespace { // 全局代码 session_start (); $a = MyProject \ connect (); echo MyProject \ Connection :: start (); } ?>
三、使用命名空间:基础
1.非限定名称(类比:同一文件下的相对文件名,例如同一个文件夹下的两个文件访问就不用加路径名了):不适用前缀,在同一个命名空间下
foo ();//前面并没有什么MyProject/
2.限定名称(类比:相对路径名):常用来使用下面命名空间的东西
<?php namespace A{ function my(){ echo "A"; } echo B\my()."<hr>";//限定名称(相对) } namespace A\B{ function my(){ echo "A\B"; } echo \A\my();//完全限定名称(绝对) } ?>
3.完全限定名称:从根出发,常用来使用非下面空间的东西。实例见上。
四、使用命名空间use的用法:导入,别名
1.目的:比如new A\B\myclass(),总是这样new的话,前面很长。那么索性直接use A\B\class;就可以直接new myclass()了。
<?php namespace A\B{ class myclass{ } } namespace { use A\B\myclass; $obj=new myclass(); // use A\B as c;//可以 // $obj=new c\myclass(); // // use A\B;//不可以,没有具体到类 // $obj=new myclass(); } ?>
五、易错点与杂项
六、关于全局命名空间(根空间)1.在声明第一个命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。另外,所有非 PHP 代码包括空白符都 不能出现在命名空间的声明之前。
<?php namespace A\B ; include 'A.php' ;//这里A.php的命名空间不会并入A\Bz中 ?>
2.PHP其它的语言特征不同,同一个命名空间可以定义在多个文件中,即允许将同一个命名空间的内容分割存放在不同的文件中
3.不能混用两种方法
<?php namespace A\B{ } namespace { } function myf(){ echo "1"; } //错误写法,不能混用两种方式 ?>
1.之前所学的函数,常量等,都在全局命名空间下:例如strlen()函数,使用的时候也可以用完全限定名称:\strlen(),当然可以省略。没有包含在任何命名空间下的东西,都在全局空间里面。只要是全局的东西,\可以省略