第九节:使用PHP命名空间

PHP面向对象编程基础

php命名空间,是一种封装事物的方法,在很多地方都可以见到这种抽象概念。在PHP中,类class和函数function必须有唯一的名字才能正常运行,如果我们包含一个名为User的第三方库类(就像我们自己的用户类),那么我们会遇到麻烦,幸运的是,命名空间来解决。

php命名空间概述

例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。

现在,如果你要构建一个小应用程序,这将是很好的。但较大的项目往往使用第三方库。例如,如果我们的项目中包含第三方库类,这将被命名为用户,就像我们自己的用户类一样,那么我们会陷入困境。幸运的是,命名空间给我们解决了极大的困扰。

php命名空间-实例演示

php命名空间-实例演示

php命名空间-实例演示

因为我们迄今为止创建的所有代码都存在于所谓的全局名称空间中。但是你可以创建你自己的名字空间。把命名空间想象成一个模块,或者是你的应用程序中的一个包或者一个文件夹,在看看是什么命名空间,先打开我们的helper.php文件,并删除我们的自动加载器。别担心,我们会在以后的视频中恢复自动加载。

回到index.php添加require app/User.php和validator.php,检查一下是否工作,我们不app改为App,现在让我们假装我们正在加载第三方库,我们将为此创建一个新的文件夹叫library,在文件夹创建一个User.php文件的User类,我们需要一些方法来识别这个类:

现在我们知道什么时候这个类是正在运行,我们要做的第一件事就是要求我们的第三方用户类位于index.php文件的顶部,我们需要在这里重命名这个文件夹(App):

刷新index.php抛出错误:

因为,我们刚才在全局命名空间中声明了两个用户类,这是不允许的,回到浏览器cannot redeclare class user

怎么修复?简单来说,只需给第二个User类写上自己的命名空间,我们只需要回到那个User类,现在在不同页面顶部,我将写入命名空间。现在在Library/User.php的写个命名空间,这需要紧接着我们真正想要这个类的命名空间。现在,我可以将这个命名空间设置为像库这样的单个单词,或者像Library\Auth\Classes这样的单词,只要这些语句由反斜杠分隔即可,这有点像一个跟随路径。这样我们就可以坚持使用我们的库:

访问index.php:

一切显示正确,错误应该消失,我们需要考虑一下,我们在全局命名空间中加载一个User类,并在其自己的库命名空间中加载一个用户类。你会看到,当我启动浏览器,我们确实没有更多的错误。所以,现在我们知道怎么使用这个用户类,一个与库命名空间的User类。好吧,简单的说,实例化你的新用户类几乎和实例化你自己的原始用户类一样。

现在好了,首先我要清理代码,然后我们将在index.php全局命名空间中创建一个var_dump用户:

$peter = new User($data);这个是全局用户,$sam = new Library\User();这个是我们库的用户,把$sam也输出到浏览器:

现在通过提供命名空间和反斜杠,我告诉PHP此刻在全局名称空间中停止查找,并将其范围改为提供的命名空间,所以让我们再次启动我们的浏览器,让我们来看看有什么。这是我们在全局命名空间中创建的第一个用户,这里是我们从我们的库用户类构造函数转储到屏幕上的字符串。这里是我们真正的用户库用户对象。正如你所看到的,这是用户类object(User)的一个对象,这是Library用户类object(Library\User)的一个对象。

PHP命名空间到底有什么优势

想想如果我们建立一个更大的应用程序,我们可能会使用第三方库的做很多事情,那些库会有自己的类,如果没有命名空间,这些类会破坏我们自己编写应用程序的类,如果它们使用与其他现有类相同的名称。现在,如果类库存在于自己的命名空间中,我们就没有这个问题。

下载本节课完整源码

接近10年的互联网从业经验,精通Scrum敏捷软件开发的方法,从事互联网产品设计,开发,测试,运营,案例不少于20个,发现自己最喜欢的工作是做外贸营销,外贸SEO,特别喜欢谷歌优化。从2017年3月开始坚持在群161510483直播谷歌SEO和WEB前端开发技术,只要加进来坚持学习零基础也能够学会。

Last modified: 2019年1月21日

Previous Story

PHP面向对象编程基础

第八节:php自动加载机制

php自动加载机制:spl_autoload_register() 函数自动加载使用类变得容易,对于小项目来说,手动管理文件和类是没有问题的,但一开始做更大的项目.

...

Next Story

PHP面向对象编程基础

第十节:使用PSR-0自动加载PHP

PSR-0自动加载:php业界提出的一个大家共同遵循的规范,很多php框架都遵循PSR-0规范, PSR是一套关于代码结构和格式的标准.

...