最新消息:周一至周五21:30分QQ群(161510483)直播,零基础免费学谷歌SEO,WEB前端,PHP入门教程

第九节:使用PHP命名空间

PHP面向对象编程基础 林雍岷 142浏览

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命名空间到底有什么优势

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

下载本节课完整源码

转载请注明:林雍岷 » 第九节:使用PHP命名空间