什么是命名空间?引用官网上的一段话:php
从广义上来讲,命名空间是一种封装事物的方法。在不少地方均可以见到这种抽象概念。例如,在操做系统中【目录】用来将相关文件分组,对于【目录】中的文件来讲,它就扮演了命名空间的角色。举个具体的栗子,在Windos操做系统中,文件 foo.txt 能够同时在目录 d:/example1 和 d:/example2 中存在,但在同一个目录中最多只能存在一个 foo.txt 文件。另外,在【目录】 之外访问 foo.txt 文件时,咱们必须将正确【目录】名以及【目录】分隔符放在文件名以前。这个原理应用到程序设计领域就是命名空间的概念。数组
命名空间一般用来解决两大类问题:函数
举个栗子:你正在维护一个项目,其中有一个文件: Member.php
, 其中有一个功能:查询全部用户的基本资料,而后使用CSV文件导出,导出数据到CSV文件的功能是以前的一个哥们写的:他把功能封装到了一个方法里:OutputStream()
。然而,很是不幸,此时客户新增长了一个需求:导出用户的所有资料,而且保留以前导出基本资料的功能。假设因为个别缘由,你不想再使用以前那哥们写的 OutputStream()
方法,须要借用第三方类库:PHPExcel
,最后当你配置成功而且载入类库文件准备开工时,却收到了错误信息:OutputStream()
方法重复了(这里假设 PHPExcel
类库中也有一个方法叫作 OutputStream()
, 若是能有个惟一标识该多好?spa
回到刚才的问题,为了解决 OutputStream()
方法冲突问题,你想到了一个办法:把以前那哥们写的 OutputStream()
加一个项目前缀:My_OutputStream()
, 而后大功告成(若是 OutputStream()
只有一处地方调用)。然而,随着项目的日积月累,项目中相似 My_…()
这种代码愈来愈多,维护也变得日益麻烦。操作系统
PHP命名空间中能够包含任意的PHP代码,可是最终只有三种类型会受到影响:类、函数、常量,变量和数组等是没有命名空间的概念的。.net
1.命名空间使用 namespace 来声明;
2.若是一个文件中包括命名空间,它必须在全部 PHP 代码前声明命名空间;
3.全部非 PHP 代码包括空白符都不能出如今命名空间的声明前;设计
简单地来讲,若是你要在一个文件中使用命名空间,这样写就对了:code
namespace FrameWork\MyFrameWork;
与目录和文件的关系很象,PHP命名空间也容许指定层次化的命名空间的名称。所以,命名空间的名字可使用分层次的方式定义:ip
namespace FrameWork\MyFrameWork; namespace FrameWork\MyFrameWork\Model; namespace FrameWork\MyFrameWork\Controller;
这个功能你们知道便可,在实际的项目开发中,应该不会出如今同一个文件中定义多个命名空间的这种状况。
详情请看官方文档:在同一个文件中定义多个命名空间开发
例如一个类为 Controller
, 若是当前命名空间是 FrameWork
, Controller
会被解析为 FrameWork\Controller
.若是当前命名空间不存在,则 Controller
是全局的。
例如 $exampe = Base\Example()
, 若是当前命名空间是 Controller
, 则 Example
会被解析为 Controller\Base\Example
, 若是当前命名空间是 Model
, 则 Example
会被解析为 Model\Base\Example
, 若是当前命名空间不存在,则 Exampl
会被解析为 Base\Example
, (PS:这种解析方式相似 Windows 中相对路径)。
例如 $exampe = \Base\Example()
, 则 Example
会被解析为 Base\Example
, (PS:这种解析方式相似 Windows 中绝对路径)。
小技巧:最前面有 “” 是绝对路径,反之是相对路径。
举个栗子:
/** * namespace2.php */ namespace FrameWork\Base\Controller; class Example { public static function here() { echo 'Namespace is FrameWork\Base\Controller !!<br />'; } } /** * namespace1.php */ namespace FrameWork\Base; class Example { public static function here() { echo 'Namespace is FrameWork\Base !!<br />'; } } include ('namespace3.php'); // 第一种解析方式: Example::here(); // Namespace is FrameWork\Base !! // 第二种解析方式: Controller\Example::here(); // Namespace is FrameWork\Base\Controller !! // 第三种解析方式: \FrameWork\Base\Example::here(); // Namespace is FrameWork\Base !! \FrameWork\Base\Controller\Example::here(); // Namespace is FrameWork\Base\Controller !!
namespace: 用来显式访问当前命名空间或子命名空间中的元素。
namespace\Example::here(); // Namespace is FrameWork\Base !!
__NAMESPACE__ : 当前命名空间的字符, 若是当前命名空间为空, 则返回”。
echo __NAMESPACE__; // FrameWork\Base
PHP 命名空间支持两种别名方式:为类名称使用别名、为命名空间名称使用别名。注意:PHP不支持函数或常量别名。
经过操做符 use 实现别名。
/** * namespace4.php */ namespace FrameWork\Base\Controller; class Example { public static function here() { echo 'Namespace is FrameWork\Base\Controller !!<br />'; } } /** * namespace3.php */ namespace Model; include ('namespace4.php'); use FrameWork\Base\Controller\Example as FBCExample; \FrameWork\Base\Controller\Example::here(); // Namespace is FrameWork\Base\Controller !! FBCExample::here(); // Namespace is FrameWork\Base\Controller !!