PSR-PHP开发规范(本文版权归作者:[email protected])

遵循PSR-4的自动加载

一、简介

  首先这里要了解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

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

时间: 2024-08-07 09:41:37

PSR-PHP开发规范(本文版权归作者:[email protected])的相关文章

php开发规范-psr系列规范

转自:http://www.cnblogs.com/x3d/p/php-psr-standards.html PSR 是PHP Standard Recommendation的简写,它其实应该叫PSRs,即系列推荐标准:目前通过的规范有PSR-0(Autoloading Standard).PSR-1(Basic Coding Standard).PSR-2(Coding Style Guide).PSR-3(Logger Interface).PSR-4(Improved Autoloadin

PHP 的一些开发规范

长篇慎入 分以下几点说明 一些编码的经验 PSR-1 PSR-2 PSR-3 PSR-4 一些编码的经验 变量命名 不用拼音 驼峰或下划线风格要一致 单词要有意义 不用关键字 常量全大写用下划线连接 代码注释 尽量让代码可读性提高,减少代码上的注释 函数头部可以描述参数和返回值及功能的注释 算法类代码一定要加注释说明 代码备份 使用 github, 本地留一份 编码统一 PHP编码 == HTML编码 == 数据库编码 == UTF-8 header("Content-type: text/ht

web前端开发规范

本文原创,这里首先声明,转载注明本文出处,翻版必究! web前端开发规范的现实意义 1.提高团队的协作能力 2.提高代码的重复利用率 3.可以写出质量更高,效率更好的代码 4.为后期维护提供更好的支持 5.可读性高 一.命名规则 1.html命名规则: a.文件名称命名规则:统一使用小写英文字母.数字.下划线的组合,不得包含汉字空格和特殊字符 2.命名原则:方便理解.方便查找 b.索引文件命名原则:index.html.index.htm.index.asp.index.aspx.index.j

Web前端开发规范手册

一.规范目的 1.1 概述 ..................................................................................................................................... 1 二.文件规范 2.1 文件命名规则...................................................................................

shell开发规范

版本1.0版,参考网上的一些文章规整而来.后期打算继续修改.完成一篇适合自己的shell开发规范. 最新编辑时间:2017.6.25 一. 命名规范 1. 版本和运行参数 1) 脚本开始之前以注释形式说明版本号:(推荐)2) 如果调用其他工具,还需说明工具的版本号:(推荐)3) 为脚本添加必须的运行参数,类似于C程序的运行参数,可使用getopt的方式取得运行参数值,如基本的参数有:-v - 版本号:-h – 帮助信息:(推荐) 2. 变量命名 1) 变量命名要前后统一,建议使用全部大写字母,如

开发规范

代码编写规范目的:能够在编码过程中实现规范化,为以后的程序开发中养成良好的行为习惯. 代码编写规范使用范围:J2EE项目开发. 包命名规范: 目的:包的命名规范应当体现出项目资源良好的划分 servlet类所在包命名规范:公司名称.开发组名称.项目名称.web.servlet 例如:net.linkcn.web.servlet 自定义标签类所在包命名规范:公司名称.开发组名称.项目名称.web.tags 例如:net.linkcn.web.tags 过滤器类所在包命名规范:公司名称.开发组名称.

MySQL 设计与开发规范

1 目的 本规范的主要目的是希望规范数据库设计与开发,尽量避免由于数据库设计与开发不当而产生的麻烦:同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很好保证. 2 适用范围 本规划的适用人员范围包括涉及数据库设计与开发的相关技术人员. 3 术语约定 本规范采用以下术语描述: ★规则:也称为强规范是编程时必须强制遵守的原则 ★建议:编程时必须加以考虑的原则 ★说明:对此规则或建议进行必要的解释 ★示例:对此规则或建议从正.反两个方面给出 4 规范及建议 4.1 书写规范 4.1.

从零开始编写自己的C#框架(3)——开发规范

原文:从零开始编写自己的C#框架(3)--开发规范 由于是业余时间编写,而且为了保证质量,对写出来的东西也会反复斟酌,所以每周只能更新两章左右,请大家谅解,也请大家耐心等待,谢谢大家的支持. 初学者应该怎样学习本系列内容呢?根据我自己的学习经验,一般直接看一遍的方法,学习与认知都会比较浅,很快就忘了.而看完后写笔记.手抄或将所看的内容照着打一遍或多次的,可以比较深刻的理解文章或代码中的思想,并能将里面的核心内容牢记在心. 对于开发规范,都是老生常谈的事情了,很多正规一些的公司都有一套规范来约束,

web开发规范文档二

头部        header\hd 内容块      content\con\bd text txt title 尾部        footer 导航        nav\menu sub-nav\sub-menu 侧栏        side-con 栏目        item 外容器      wrapper\sprite 左右中      left\right\center 上下        top\bot 登录        login-bar 标志        logo