php+psr4和自动加载,Composer自动加载机制学习——PSR-0及PSR-4

"本文详细介绍了PHP中的PSR-0和PSR-4自动加载规范,通过实例展示了如何配置composer.json和文件结构以实现自动加载。在PSR-0中,自动加载会在application目录下寻找类文件,而在PSR-4中则简化了路径,省略了App。同时解析了composer生成的autoload文件以及自动加载的流程,包括查找和引入类文件的过程。"
摘要由CSDN通过智能技术生成

前面分析了file和classmap的加载方式,本篇介绍PSR-0和PSR-4的加载方式。

PSR标准

PSR-0自动加载

1.在composer.json同级目录下新建文件:\application\Controller\Test.php,内容如下:

2.修改composer.json文件,内容如下:

3.修改index.php,内容如下:

4.更新composer配置文件

运行命令:composer dump-autoload

5.执行index.php:php index.php,报错了,提示找不到:

16fd1ddc739f1502feb98363ab948ec4.png

原因为PSR-0会在application文件夹下去找\App\Controller\Test.php文件是否存在,存在则引入。但显然\application\App\Controller\Test.php文件并不存在。

解决办法:在application文件夹下新建一个App文件夹,然后把Test文件夹放进去就可以了。

PSR-4自动加载

PSR-4就简洁多了。

1.修改composer.json文件:

2.更新composer配置文件

运行命令:composer dump-autoload

3.执行index.php:php index.php,PSR-4会根据此路径:\application\Controller\Test.php找文件,存在则引入。跟PSR-0相比,就省略了App\。

自动加载流程分析

psr-0

当composer.json中指定的是PSR-0加载方式时,执行composer dump-autoload命令后,产生了如下变化:

1.autoload_namespaces.php

该文件返回的数组中,会增加一个元素:

内容为App对应的磁盘路径。

2.autoload_static.php

该文件新增了1个静态成员属性,$prefixesPsr0。

$prefixesPsr0用类全名的第一个字母来做分类,方便后续的快速搜索。值为类所在的磁盘路径。

psr-4

当执行composer dump-autoload命令后,产生了如下变化:

1.autoload_psr4.php

该文件返回的数组中,会增加一个元素:

内容为App对应的磁盘路径。

2.autoload_static.php

该文件新增了两个静态成员属性,$prefixLengthsPsr4和$prefixDirsPsr4。

$prefixLengthsPsr4用类全名的第一个字母来做分类,方便后续的快速搜索。

$prefixDirsPsr4为类所在的磁盘路径。

自动加载过程

当程序执行到需要加载类文件时,首先调用的是ClassLoader.php文件的loadClass方法。

该方法中通过findFile方法来查找类文件,如果找到了,就通过includeFile引入进来。findFile方法的内容如下:

该方法首先检查自身的classMap数组中是否包含有该类,如果有,直接返回。如果没有则执行到$this->findFileWithExtension方法中。

findFileWithExtension方法的代码如下:

可以看到,首先是按照PSR-4的标准,按类首字母进行循环,如果匹配到,则进一步匹配循环,如果找到类文件,则引入。如果按照PSR-4标准没有找到,则继续按PSR-0标准循环查找,如果找到类文件,则引入。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值