自动加载类autoload psr-0与psr-4标准

yang-pig| 阅读:873 发表时间:2018-03-18 23:33:59 PHP

最近一直想整理一下关于php的自动加载类的方式进行一个总结。每个人都想在自己的代码中少一些include 和 require 的操作, 这样不仅能方便代码编写,而且能够减少不必要的引入类文件冲突的问题。下面我们分别来介绍 psr-0 和 psr-4 规范.

PSR-0规范 
1 命名空间必须与绝对路径一致 
2 类名首字母必须大写 
3 除去入口文件外,其他“.php”必须只有一个类 
4 php类文件必须自动载入,不采用include等 
5 单一入口

案例 
当有一个项目的路径是如下图所示: 

1.png

Request.php 的代码是:

2.png

当我们的 index.php 文件需要引入 Request.php 里的类时 ,我们发现直接写路径是十分困难的事情,也许会因为太长而不小心写错.因此引入了psr-0的这种自动加载规范。 

index.php 代码

3.png

autoload.php 代码

4.png

5.png

6.png

运行结果:

GM%5[%1FYU3@SXY39]FVR%V.png

小结:这是一个基本的使用psr-0规范进行自动加载的方式,主要是将类名中的 _ 下划线 转换成 文件夹分割线 / or \ ,再加上自己定义好的一个路径或者路径集合进行查找是否符合 自定义文件夹($dir)+”/”+” Http/Request” + 后缀(.php) 的文件,如果存在就可以进行包含了。

PSR-0 命名空间类加载例子 

Core\ClassLoader.php 如何自动加载

1.png

修改 index.php

$5P]P0]W]8ZVSC(XRP`%16V.png

实际上 \Core\ClassLoader 这个带有命名空间的类,会有以下几个步骤.

  1. 尝试 去掉 首字母 \
  2. 将类中的 \ 转换成 系统的文件夹分隔符 DIRECTORY_SEPARATOR ,此时去找的类文件会变成 Core / ClassLoader
  3. 查看接下来的类文件中是否存在 _ 下划线 ,如果存在,则转换为 文件夹分隔符.
  4. 添加文件后缀名 .php

最后 需要include 的文件变成 包含文件目录下 + Core/ClassLoader.php

PSR-4规范 
PSR-4和PSR-0最大的区别是对下划线(underscore)的定义不同。PSR-4中,在类名中使用下划线没有任何特殊含义。而PSR-0则规定类名中的下划线_会被转化成目录分隔符。 
PSR-4会预先加载目录映射,如上面的例子为例,\Core\ClassLoader 类在Core命名空间里,PSR-4规范会设定一个路径来指定Core命名空间属于某一个文件夹(example: \Core\ => vendor/myApp/Core/src/ ) 这样去找类的时候, 就会去对应的目录下去找。

注意: PSR-4 规范 要求在设置命名空间映射是,要求命名空间尾部含有 \符号。以表示为命名空间类。

更多关于PSR-0 和 PSR-4的规范,其实可以去阅读composer 下对自动加载类的 实现。