PSR-PHP开发规范(本文版权归做者:luluyrt@163.com)

遵循PSR-4的自动加载

1、简介

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

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

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

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

2、 自动加载类库介绍

  首先看下自动加载类的大概内容: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循环中,会慢慢的缩短命名空间前缀的名称去需找合适的命名空间前缀,为何要这么作呢?app

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

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

  

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

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

3、 例子

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

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

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

相关文章
相关标签/搜索