一、PSR0简介

下文描述了若要使用一个通用的自动加载器(autoloader),你所需要遵守的规范:

  • 一个完全标准的命名空间(namespace)类(class)的结构是这样的:\<Vendor Name>\(<Namespace>\)*<Class Name>
  • 每个命名空间(namespace)都必须有一个顶级的空间名(namespace)("组织名(Vendor Name)")。
  • 每个命名空间(namespace)中可以根据需要使用任意数量的子命名空间(sub-namespace)
  • 从文件系统中加载源文件时,空间名(namespace)中的分隔符将被转换为 DIRECTORY_SEPARATOR
  • 类名(class name)中的每个下划线_都将被转换为一个DIRECTORY_SEPARATOR。下划线_空间名(namespace)中没有什么特殊的意义。
  • 完全标准的命名空间(namespace)类(class)从文件系统加载源文件时将会加上.php后缀。
  • 组织名(vendor name)空间名(namespace)类名(class name)都由大小写字母组合而成。
以下,列出PSR0构建的规范类的几种形式:
 

二、实现PSR0自动加载

  1. function autoload($className)
  2. {
  3. $className = ltrim($className, '\\');
  4. $fileName  = '';
  5. $namespace = '';
  6. if ($lastNsPos = strrpos($className, '\\')) {
  7. $namespace = substr($className, 0, $lastNsPos);
  8. $className = substr($className, $lastNsPos + 1);
  9. $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
  10. }
  11. $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
  12. require $fileName;
  13. }
  14. spl_autoload_register('autoload');

三、PSR4简介

这个 PSR 描述的是通过文件路径自动载入类的指南;它作为对 PSR-0 的补充;根据这个 指导如何规范存放文件来自动载入;
  1. 术语「类」是一个泛称;它包含类,接口,traits 以及其他类似的结构;

  2. 完全限定类名应该类似如下范例:

    <NamespaceName>(<SubNamespaceNames>)*<ClassName>

    1. 完全限定类名必须有一个顶级命名空间(Vendor Name);
    2. 完全限定类名可以有多个子命名空间;
    3. 完全限定类名应该有一个终止类名;
    4. 下划线在完全限定类名中是没有特殊含义的;
    5. 字母在完全限定类名中可以是任何大小写的组合;
    6. 所有类名必须以大小写敏感的方式引用;
  3. 当从完全限定类名载入文件时:

    1. 在完全限定类名中,连续的一个或几个子命名空间构成的命名空间前缀(不包括顶级命名空间的分隔符),至少对应着至少一个基础目录。
    2. 在「命名空间前缀」后的连续子命名空间名称对应一个「基础目录」下的子目录,其中的命名 空间分隔符表示目录分隔符。子目录名称必须和子命名空间名大小写匹配;
    3. 终止类名对应一个以 .php 结尾的文件。文件名必须和终止类名大小写匹配;
  4. 自动载入器的实现不可抛出任何异常,不可引发任何等级的错误;也不应返回值;

在其中有以下的类实例,但是相对与PSR0,却是不太容易明白

首先,\Symfony\Core\Request和\Zend\Acl很好理解,其满足PSR0规范,但是\Acme\Log\Writer\File_Writer就不太好理解了。

四、Composer对PSR4的处理

看了Composer对PSR4的处理,才能比较容易理解PSR4。自动生成的PSR4配置文件名称为autoload_psr4.php(PSR0的是autoload_namespace.php),配置文件返回一个关联数组,键是名称空间的前缀,值是名称空间前缀对应的路径。
 
以\Acme\Log\Writer\File_Writer作为例子,其名称空间前缀是\Acme\Log\Writer,则其在autoload_psr4.php表示为
  1. '\\Acme\\Log\\Writer' => (array) './acme-log-writer/lib/'

使用自动加载时,先通过名称空间的前缀,找到对应的映射路径,在根据PSR0规范找到对应的类定义文件。但是这里有些例外,类名中的下划线在PSR4中是不需要转换成目录的。

 
使用PSR4,我觉得有2个好处:
1. 减少代码目录的深度
2. 可以通过前缀快速找到映射目录,提高自动加载的效率

PHP规范PSR0和PSR4的理解的更多相关文章

  1. PSR-0到PSR-4编程规范

    PHP-FIG 在说啥是PSR-[0-4]规范的之前,我觉得我们有必要说下它的发明者和规范者:PHP-FIG,它的网站是:www.php-fig.org.就是这个联盟组织发明和创造了PSR-[0-4] ...

  2. php composer 使用 以及 psr0和psr4的真正区别

    composer 使用 项目和库之间唯一的区别是,你的项目是一个没有名字的包 包名不区分大小写,但惯例是使用小写字母,并用连字符作为单词的分隔 入门比较好资源: 官网适合读一遍  https://do ...

  3. psr-0和psr-4命名规范(未完)

    这些命名规范都是为为自动加载服务(避免项目中有很多的include和require) psr-0: 1.命名空间必须与绝对路径一致 2.类名首字母必须大写 3.除入口文件外,其他“.php”必须只有一 ...

  4. PSR-4 规范实例讲解 -- php 自动加载

    参考 参考文档:https://www.kancloud.cn/thinkphp/php-fig-psr/3144 参考实例:https://github.com/php-fig/fig-standa ...

  5. PSR规范0-4整理

    PSR规范 psr规范 引言: PSR 是 PHP Standard Recommendations 的简写,由 PHP FIG 组织制定的 PHP 规范,是 PHP 开发的实践标准.这些规范的目的是 ...

  6. 【转载】PHP PSR-1 基本代码规范(中文版)

    基本代码规范 本篇规范制定了代码基本元素的相关标准, 以确保共享的PHP代码间具有较高程度的技术互通性. 关键词 "必须"("MUST")."一定不可 ...

  7. PHP编码规范PSR-1

    .note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...

  8. psr的规范

    基本代码规范 本篇规范制定了代码基本元素的相关标准, 以确保共享的PHP代码间具有较高程度的技术互通性. 关键词 "必须"("MUST")."一定不可 ...

  9. PSR规范

    背景 Framework Interoperability Group(框架可互用性小组),简称 FIG,成立于 2009 年.FIG 最初由几位知名 PHP 框架开发者发起,在吸纳了许多优秀的大脑和 ...

随机推荐

  1. MACD判断定背离,底背离

    MACD背离: 价格创新高而指标却下跌 价格创新低而指标却上涨 缠中说禅背离 多次缠绕中唇吻的面积更小 看图说话:

  2. MySQL 批量杀mysql线程

    mysql> SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='root'; +---- ...

  3. minimum-path-sum-动态规划

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  4. java并发之SynchronousQueue实现原理

    前言 SynchronousQueue是一个比较特别的队列,由于在线程池方面有所应用,为了更好的理解线程池的实现原理,笔者花了些时间学习了一下该队列源码(JDK1.8),此队列源码中充斥着大量的CAS ...

  5. DDIA

    https://vonng.gitbooks.io/ddia-cn/content/ch7.html

  6. C++ 的 runtime exception是没有扩展性的

    https://groups.google.com/forum/#!topic/seastar-dev/RuK-OajeqHk https://www.google.com/search?ei=gTH ...

  7. hbuilder mui uploader图片上传到服务器完整版(ASP.NET)

    html布局,比较简单,模仿微信的: <div class="dynamic_images"> <ul> <!--<li><img  ...

  8. 《Java设计模式》之模板方法模式

    模板方法模式是类的行为模式.准备一个抽象类.将部分逻辑以详细方法以及详细构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类能够以不同的方式实现这些抽象方法,从而对剩余的逻辑有 ...

  9. mac下phpstrom安装主题和主题推荐

    phpstorm主题 在mac下finder下command+shift+G键到~/Library/Preferences/PhpStorm2016.2/colors,我的路径可能和你的不同,但是大同 ...

  10. 【转】Linux定时任务之 【crontab】

    Linux定时任务Crontab命令详解 linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另 外, ...