• 四月
  • 05
  • load

PHP namespace和use的用法与实践 2018-04-05 13:06:50

在介绍他们之前,首先声明一点:namespace和use并不是require_once的代替品,而是需要使用spl_autoload_register配合

什么是namespace?怎么用?

你和同事一起开发一个项目……你负责A文件夹的代码,而同事负责B文件夹的代码

你和同事都起了个tool.php,很显然,你们所负责的文件夹并不是同一个,并不会产生任何影响,不过,我们还是先看一个模拟场景吧。

这是项目目录结构:

这是你的代码:

这是你同事的代码:

如果因为需求问题,必须要在index.php引入你们的php文件

先不管上面的代码会不会报错,先产生一个疑问;我想调用你的代码,要怎么办?难道要你同事改名?如果还有更多的未知文件有这个问题,总不能遇到才改名吧?

这个时候,namespace的作用就来了,从现在开始,你们的代码都要加上namespace。

这是你的代码:

这是你同事的代码:

首页想调用你的代码

首页想调用你的代码,并且省略创建所附带的namespace

好的,是不是解决了命名冲突问题?而且还不用制约像class ToolA和class ToolB这样的奇葩命名规范

namespace的注意事项:

1.namespace不区分大小写,你namespace定义为A,创建对象完全可以这样:$tool = new a\tool();

2.只要使用了namespace,创建对象时就必须要加上namespace所声明的命名,例如这样就是错的:$tool = new tool();

3.namespace不是路径,你可以命名为任意名字,考虑到这是为了团队开发而准备的东西,最好还是以路径为命名,并且不要加上类名

4.namespace就像变量,出现多个时会被替换不会叠加

5.就像header,只要页面输出内容就不能使用namespace

什么是use?怎么用?

虽然有了namespace这么方便的东西,但是命名冲突这个问题在实际开发中还是不太常见的,由于namespace的特征不太适合作为省略对象的命名空间而使用,这时候use的作用就来了

这是你的代码:

这是你同事的代码(跟之前不一样):

首页调用

是不是一下就明白了?

use注意的是,你的class上的namespace写了什么,那么use也要写什么,并且还要加上类名

扩展内容:如何利用namespace和use减少require_once的编写

这应该是刚接触namespace和use的人所关心的话题,就如第一句话所说的,namespace和use并不能代替require_once,需要spl_autoload_register配合自动加载

现在,这是项目目录结构:

这是A/Tool/Time.php

这是B/Tool/System.php

这是index.php

怎么样,是不是把require_once“省略”了?只要尝试创建对象,spl_autoload_register都会执行,可以利用这个特征自动require_once,使用namespace和use来示明文件的路径在哪,就像java的import了

 

原创文章,转载请注明出处

正在加载评论...

0 / 240

警告

确定