一、简介

  首先这里要了解PSR,Proposing a Standards Recommendation(提出标准建议)的缩写,就是一种PHP开发规范,让我们研发出来的代码更合理、更好维护、可读性更高。PSR有下面几个标准:

  •   PSR-0:自动加载
  •   PSR-1:基本代码规范
  • PSR-2:代码样式
  •   PSR-3:日志接口
  •   PSR-4:规范自动加载的路径问题

  这里看出PSR的下标也是从0开始的,和数组还有点像~。其实PSR-4和PSR-0是有点相似甚至冗余的,他们都说明的是自动加载的规范,只不过PSR-4中的规范更加简洁,在PSR-0中下划线"_"是有特殊含义的,在autoload处理的时候需要将下划线转换为目录分隔符,而在PSR-4中下划线是没有任何特殊含义的,所以在文件自动加载的时候显得更加简洁、调理更加清楚。

  我对github上面的psr-4规范中的例子进行了大概的翻译(相信你们的英语水平一定比我好,肯定可以看懂^_^),然后以这个自动加载类库做了一个小小的例子,例子文件多、长,放在这里不太合适,所以我在博客中就大概介绍下这个例子,想要详细了解的可以去我的github主页去看这个例子。

二、 自动加载类库介绍

  首先看下自动加载类的大概内容:

class Autoload{// 注册自动加载函数到spl autoload栈中.public function register();// 添加一个目录到一个命名空间前缀中public function addNamespace($prefix, $base_dir, $prepend=false);// 自动加载函数,会在$this->register中用到public function loadClass($class);// 寻找映射的文件public function loadMappedFile($prefix, $relative_class);//查看一个文件是否在文件系统中存在public function requireFile($file);}

  自动加载类库函数中就这几个函数,其中register()、addNamespace()、loadMappedFile()、requireFile()函数都比较简单,一看就懂,唯一一个可能需要解释下的函数就是loadClass函数,先看下loadClass()函数的代码:

 1     public function loadClass($class)
 2     {
 3         // 当前的命名空间前缀
 4         $prefix = $class;
 5
 6         //通过命名空间去查找对应的文件
 7         while (false !== $pos = strrpos($prefix, '\\')) {
 8
 9             // 可能存在的命名空间前缀
10             $prefix = substr($class, 0, $pos + 1);
11
12             // 剩余部分是可能存在的类
13             $relative_class = substr($class, $pos + 1);
14
15             //试图加载prefix前缀和relitive class对应的文件
16             $mapped_file = $this->loadMappedFile($prefix, $relative_class);
17             if ($mapped_file) {
18                 return $mapped_file;
19             }
20
21             // 移动命名空间和relative class分割位置到下一个位置
22             $prefix = rtrim($prefix, '\\');
23         }
24
25         // 未找到试图加载的文件
26         return false;
27     }

  其实有疑惑的地方可能也只有一个,那就是为什么这里要循环着去试图查找文件,在while循环中,会慢慢的缩短命名空间前缀的名称去需找合适的命名空间前缀,为什么要这么做呢?

  循环查找文件是为了在命名空间中包含更多的内容,不用每次在父命名空间中新建一个文件夹的时候都去添加一个新的命名空间前缀,就像下面这个图中描述的那样:

  当一个文件在一个命名空间下的子目录下的时候,我们不用去新建命名空间前缀就可以成功加载需要的文件,维护命名空间前缀的数组内容更少,更好维护。相反的如果没有循环查找,就是下面这个样子的

  

  每次新建一个子目录就要去新加一个命名空间前缀,是不是很麻烦,但这样的话也有一定的好处,就是加载的时候不晕循环查找文件,可能会减小一定的时间消耗,但就是加载的时候有点麻烦。

  所以,用循环加载这种方式还是比较方便的,但是一定不能让没有命名空间前缀的目录层级太深,这样会消耗不必要的时间到文件加载上。当需要效率很高的时候,而我们的目录肯定又不会不确定,这个时候加载的时候去掉循环查找,而是为每个目录添加命名空间,效率可能会提高,只是我的一点愚见。

三、 例子

  说道这里你可能已经对自动加载的内容比较了解了,这个时候趁热打铁看看我准备的小例子,这里只是介绍下小例子的目录结构,由于比较简单,详细的内容就不再这里列了,感兴趣的通许可以去我的github主页看看这个例子

+autoload    +core        |_Autoload.php    +vendor        +test1            |_hello.php        +test2            |_world.php    |_App.php

  本文版权归作者(luluyrt@163.com)和博客园共有,未经作者本人同意禁止任何形式的转载,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/iforever/p/4199540.html

遵循PSR-4的自动加载相关推荐

  1. php psr 编码规范_PHP之PSR-4规范:自动加载

    1. 概述 本 PSR 是关于由文件路径 自动载入 对应类的相关规范, 本规范是可互操作的,可以作为任一自动载入规范的补充,其中包括 PSR-0,此外, 本 PSR 还包括自动载入的类对应的文件存放路 ...

  2. 宝塔 php redis not found in_PHP之PSR-4规范:自动加载

    1. 概述 本 PSR 是关于由文件路径 自动载入 对应类的相关规范, 本规范是可互操作的,可以作为任一自动载入规范的补充,其中包括 PSR-0,此外, 本 PSR 还包括自动载入的类对应的文件存放路 ...

  3. PHP PSR-4 Autoloader 自动加载(中文版)

    引用:https://segmentfault.com/a/1190000002521658 Autoloader 关键词 "必须"("MUST")." ...

  4. [PHP] 自动加载的实现

    基于psr的规范,使用命名空间和spl_autoload_register()来实现自动加载 文件结构: |--Api |--Account.php |--User.php |--Service |- ...

  5. 你不知道的composer自动加载

    2019独角兽企业重金招聘Python工程师标准>>> 我们都知道Composer是现代PHP框架(Yii2.Laravel...)的基石,有了Composer后我们开发是一件多么的 ...

  6. 【php】命名空间 和 自动加载的关系

    目的 本文的目的主要是说明 命名空间的 use 关键词 和 new ClassName 这两个步骤,哪个步骤才会执行自动加载,这是逻辑有点混乱的表现,这种想法也是很正常的,让我们来解密吧 命名空间(n ...

  7. Composer自动加载(一)

    我的个人博客:逐步前行STEP Composer是PHP的基于项目的依赖管理工具,它本身集成一个autoloader,支持PSR-4,PSR-0,classmap,files 四种自动加载方式. #首 ...

  8. PHP PSR4自动加载代码赏析

    转载地址:https://www.cnblogs.com/wangmy/p/6692970.html 第一部分是引入自动加载配置文件 1.入口文件:autoload.php 里面没什么东西,就是导入C ...

  9. thinkphp 框架自动加载原理_这下你应该理解ThinkPHP的Loader自动加载了

    想了很久终于要开始系列文章的编写了,期望是写出提升和面试都可以搞定的系列文章. 当你看到本文时,如果你发现咔咔没有编写到的面试热点问题或者技术难点,期待评论区指出,一起完善. 前言 目前再整理PHP进 ...

  10. PHP自动加载下——PSR4

    1.先来介绍一下PSR规范 PHP-FIG,它的网站是:www.php-fig.org.就是这个联盟组织发明和创造了PSR规范,其中自动加载涉及其中两个规范,一个是PSR0,一个是PSR4, PSR0 ...

最新文章

  1. linux shell for 循环变量,shell for循环总结
  2. 被骗两次?黄仁勋骗过世界的14秒,英伟达押宝未来的元宇宙……
  3. q-LDPC实验进展
  4. 一起学nRF51xx 6 - uart
  5. python图书馆管理系统实验报告_基于Python的图书馆业务报表自动生成研究
  6. 复制linux内核,linux内核写时复制机制源代码解读
  7. mvc框架upgrade
  8. Effective Java~45. 谨慎使用Stream
  9. Rollback Protection
  10. WEB-INF目录结构
  11. leetcode - Best Time to Buy and Sell Stock Ⅱ
  12. Java对数组的操作(一)
  13. Python开发环境配置 Vim + Ctags+ TagList
  14. iconfont 图标宽高出问题_IconFont使用注意点
  15. 东方通TongWeb启动springboot报错
  16. Windows 10原创知识题(第三版)
  17. Python_072205_创建一个类方法记录车的品牌mark、颜色color、价格price、速度speed等特征, 并实现增加车辆信息、显示车辆全部信息的功能。
  18. 【书】软件设计师教程(第4版)(百度云免费下载链接)
  19. python操作个人简历,python爬虫开发工程师应届生个人简历模板(Word可以直接使用)...
  20. 大数据导论(二:大数据的架构)

热门文章

  1. ACL'22 | 一种基于隐变量建模的并行文本生成模型
  2. 百度中文依存句法分析工具DDParser重磅开源
  3. AI市场需求变化了,应届生们却还停留在几年前的认知上...
  4. 【实践】BiLSTM上的CRF,用命名实体识别任务来解释CRF(1)
  5. 详解中文维基百科数据处理流程及脚本代码
  6. 每日算法系列【LeetCode 128】最长连续序列
  7. 深度学习TF—10.循环神经网络RNN及其变体LSTM、GRU实战
  8. 芯故事 心感动:英特尔企业文化的力量
  9. 二十一天学通JavaScript:创建与读取cookie
  10. PyTorch:模型训练-分布式训练