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

PHP面向对象编程基础

PSR-0自动加载,是php业界提出的一个大家共同遵循的规范,很多php框架都遵循PSR-0规范,PSR是一套关于代码结构和格式的标准。SPL(Standard PHP Library)是php的标准拓展类库,php实现类自动载入推荐使用SPL提供的spl_autoload_register方法注册一个类自动载入函数。

PSR-0自动加载简要概述

这节课将帮助你使用PSR-0创建自动加载,PSR可以说它的目标是确保框架和其他软件之间更好的互操作性,现在第一个标准的PSR-0是一个自动加载标准,现在第一个标准PSR-0是一个自动加载标准,它被广泛采用,也是composer工具用于自动加载的标准,也使用名称空间。

它要求每个名称空间都有一个顶级名称空间,应该是供应商(vendor)名称,然后每个名称空间可以拥有尽可能多的子名称空间。所以,在我的情况下,我可以有peter\app\auth这样的东西,在这个标准中,命名空间分隔符(sub-namespaces),所以这将是反斜杠,被转换为目录分隔符 DIRECTORY_SEPARATOR,同样,下划线被转换为目录分隔符,希望你们阅读整个PSR-0规范,但是现在最重要的是要知道,所有这些命名空间,转换为你的应用程序的实际文件夹结构。

PSR-0自动加载-实例演示

现在我们就要建立这个文件结构,让我们先创建一个新的文件夹叫Peter,这将是我们vendor名称,那么我们将把我们的应用程序文件夹(App)和我们的库拖到里面。现在,我想要的那些名称空间文件夹里面都是类。把Helper.php移到这个文件夹的最外面(如下图),现在这个时候,我们的应用程序已经完全打破接下来我要做的是逐个打开所有的类,然后添加命名空间。

PSR-0自动加载-文件结构调整

PSR-0自动加载-文件结构调整

在Peter/App/User.php,Peter/App/Validator.php和Peter/Library/User.php文件最头部添加namespace代码分别是:

现在我们需要打开库文件夹中的User类,因为我们需要改变这个名字空间,那应该是peter库,子文件夹也被称为库。现在我们的Helper.php文件不再包含自动加载器,创建个新文件叫Autoload.php,把PSR-0自动加载标准代码复制过来:

是不是非常简单?像我们第一个自动加载,它将采用类名作为参数。现在这将包括整个命名空间,这可能是Peter\App\User,那么你将采用这个类名称,并删除和前斜杠,它是在第一行。其次,它把这个字符串分成几部分,现在第一部分将是命名空间,所以这将是Peter的东西,\App,并且类名将包含实际的用户类名称,例如,这将是User。一旦有了它,它会建立一个文件要求。它将用目录分隔符替换所有的反斜杠,它也将用目录分隔符替换所有的下划线。最后但并非最不重要的是,它会附加一个.php扩展名。

所以如果我们实例化一个新的\Peter\App\User,那么它只会删除第一个反斜杠,并用正斜杠替换这些反斜杠,根据系统来定,所以我的目录分隔符是正斜杠Peter/App/User,然后添加.php,实际是Peter/App/User.php,最后,我们还需要添加那个自动注册加载功能代码:

所以我们拥有所有的命名空间,包括我们自动的,但是在index.php我们仍然在这里调用错误的类$validator = new Validator()等等,我们应该改为:

最后我们要在inde.php头部添加require ‘autoload.php’:

在auload.php的头部添加:

刷新index.php看是否正确工作:

返回正确,如果我想从我的PeterLibraryUser类中调用一个验证器类,该怎么办?尝试在这里library\user.php输出我们的验证器类,看看我们得到什么样的错误:

返回index.php刷新浏览器看看:

报错require peter/App/Validator文件不存在,这是因为它搜索相对于它(Peter\Library)当前所在的名字空间,即Peter文件下面的Library,现在有三种可能的解决方案:

第一种
首先是使用其全名称空间来调用该类,但在前面加一个反斜杠,现在这个反斜杠告诉PHP它应该看起来相对于全局名称空间。

错误没有了。

第二种
在名称空间下创建一个use语句,你只需要使用Peter/App/Validator,这就像在这里顶部的require语句,我可以完全删除它。

PHP会知道我实际上试图加载Peter/App/Validator,现在有几个关于use语句的东西,你可以在多行上创建多个使用语句,你也可以把它们放在一个用逗号隔开的单行上,像这样:

第三种
为我们的语句创建一个别名,如果我做了像使用Peter/Validator和SuperValidator一样的东西:

你看,那还在加载Peter/App/Validator类,现在这个特别方便,如果我想要调用的类与我们的类在这里有相同的名称,所以举例来说,我会尝试加载Peter/App/User在这里和var_dump一个新的用户和PHP会混淆当然,它不知道是否使用这个类或这个类,但是,如果我别名,我可以称之为别名:

返回index.php刷新输出:

这就是psr-0自动加载。
下载本节课完整源码

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

Last modified: 2019年1月21日

Previous Story

PHP面向对象编程基础

第九节:使用PHP命名空间

php命名空间:是一种封装事物的方法都可以见到这种抽象概念,在PHP中,类class和函数function必须有唯一的名字才能正常运行.

...

Next Story

PHP面向对象编程基础

第十一节:PHP类的继承和受保护的作用域

PHP类的继承:熟知的一个程序设计特性PHP对象模型也使用继承,在OOP中,我们可以用一个类并从中创建一个子类.

...