如何在PHP中使用命名空间

  

如何在PHP中使用命名空间?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

前言

命名空间(namespace),在编程语言中,是对作用域的一种特殊的抽象.它表示着一个标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他命名空间中。

在PHP中也存在命名空间的用法,由它控制可见范围的这个标识符一般指的就是类和函数。

一、PHP命名空间基础

从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如PHP的类名是不可以重复的,但是经常我们需要引入一些第三方的类库,常常类名就会在项目中产生重复冲突,所以,命名空间就是解决这个冲突的一种方法。

在PHP5.3以后,就已经引入了命名空间(namespace)的概念,即同个命名空间下的类名不能重复,不同命名空间下可以存在同名的类。

这样,在引入第三方类库的时候,只有各个类库的命名空间不一样,就不会产生冲突。

所以根据官方所说,在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:

1、用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
2、为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

需要注意的是:

  • 同个文件下可以存在多个命名空间;

  • 不同命名空间内的类可以相互调用。

如何在PHP中使用命名空间

二、PHP命名空间的用法

1、定义

命名空间的定义采用关键字namespace,定义方式如下:

namespace example

则该命名空间下的类都归属于该命名空间,example命名空间下的类不能重名。

或者可以定义多级命名空间:

namespace example\test\demo

则改命名空间下的类全归属于example\test\demo命名空间。

定义后的命名空间可以用__NAMESPACE__魔法变量来获取当前命名空间。

2、引入

引入命名空间使用关键字use,可以通过多个use在一个文件中引入多个命名空间:

use example;
  use 示例测试\ demo \; 

需要使用到哪个命名空间的类和方法,则使用哪个命名空间,前提是这些命名空间的实际文件地址已经包含进来了,或者说能实现自动的类加载了。

<强> 3,实例化

在程序中实例化并使用某个命名空间下的类方法,同样使用新关键字进行实例化,但是需要在类名前面加上命名空间前缀。

例如:

class 美元;=,new 例子\();//实例化例子命名空间下的一个类   class 美元;=,new 示例测试\ \ demo \ b();,//实例化例子测试\ \ demo命名空间下的b类

如果在文件前面已经引入了这些命名空间,则可以不需要类的前缀:

use 例子;   use 示例测试\ demo \;   $ class =, new ();//实例化例子命名空间下的一个类   class 美元;=,new  b();,//实例化例子测试\ \ demo命名空间下的b类

<强>注:强如果用的时候是<代码>使用示例\测试;则在实例化b类时要带上相对命名空间路径(注意不是实际文件路径),即<代码>新演示\ b();

当然所有的实例化都可以直接使用绝对路径形式,即在命名空间前面加\字符,如<代码>新\ \测试例子\ demo \ b(); 这样就采用了绝对路径形式实例化了b类。

<强> 4,别名

在用名称空间定义命名空间的时候,为了避免之后引用的时候命名空间过长,可以在定义时采用的关键字为一个命名空间指定别名

namespace 示例测试\ \ demo  as  testDemo;

这样在之后引用或实例化的时候就可以<代码>新testDemo \ & lt;类名祝辞();

如何在PHP中使用命名空间