PSR-4规范不要求改变代码的实现方式,只建议如何使用文件系统目录结构和PHP命名空间组织代码,PSR-4规范以PHP命名空间和文件系统目录结构来查找并加载PHP类、接口和Traits,这正是PSR-4的精髓所在。下面我们来自己手动实现一个PSR-4自动加载器
关于PSR-4规范,可以参见《PSR-4 自动加载规范》
PSR-4规范描述了一个标准的自动加载器策略,指在运行时按需查找PHP类、接口或Traits。支持PSR-4自动加载器标准的PHP组建和框架,使用同一个自动加载器就能找到相关代码,然后将其载入PHP解释器。有了这个功能,就可以把现代PHP生态系统中很多客户操作的组件联系起来。
/**
* 使用SPL组册这个自动加载函数后,遇到下述代码时这个函数会尝试 从/path/to/project/src/Baz/Qux.php文件中加载\Foo\Bar\Baz\Qux类:
* new \Foo\Bar\Baz\Qux;
* @param string $class 完全限定的类名。
* @return void
**/
spl_autoload_register(function ($class) {
// 项目的命名空间前缀
$prefix = 'Foo\\Bar\\';
// 目录前缀对应的根目录
$base_dir = __DIR__ . '/src/';
// 判断传入的类是否使用了这个命名空间前缀
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
// 没有使用,交给注册的下一个自动加载器处理
return;
}
// 获取去掉前缀后的类名
$relative_class = substr($class, $len);
// 把命名空间前缀替换成根目录,
// 在去掉前缀的类名中,把命名空间分隔符替换成目录分隔符,
// 然后在后面加上.php
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
// 如果该文件存在,就将其导入
if (file_exists($file)) {
require $file;
}
});
这样我们就写好了一个PSR-4的自动加载器了
PSR-4自动加载的好处和方式都可以很好的提升代码可读性与优雅,从而在项目里面减少了 require、include 关键字的使用(ps:我看见这些关键字懒得去找,而且有些IDE也不支持,头大)
比如我要引入自己封装的qq登录
$qq = new \tencent\QQ();
$res = $qq->doLogin();
而对应的这个QQ类在对应的这个目录
QQ类只需要声明一下跟文件路径一致的命名空间空间就行了
是不是很方面呐
参考:
- 《Morden PHP中文版》
- https://www.php-fig.org
- https://www.jianshu.com/p/b33155c15343