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自动加载的好处和方式都可以很好的提升代码可读性与优雅,从而在项目里面减少了 requireinclude 关键字的使用(ps:我看见这些关键字懒得去找,而且有些IDE也不支持,头大)

比如我要引入自己封装的qq登录

 $qq = new \tencent\QQ();

 $res = $qq->doLogin();

而对应的这个QQ类在对应的这个目录

269435341200984


QQ类只需要声明一下跟文件路径一致的命名空间空间就行了

9143531882440927

是不是很方面呐


参考:

  1. 《Morden PHP中文版》
  2. https://www.php-fig.org
  3. https://www.jianshu.com/p/b33155c15343


最后修改:2020 年 06月 01日 22:46:11

文章声明:非特殊说明,本文版权归 凌萍分享 所有,转载请注明出处
本文标题:如何写一个PSR的自动加载器
本文标签:PHP,PSR,规范
如果觉得本篇文章对你有用,请随意赞赏;赞赏将用于服务器、域名开支