PSR规范0-4整理

PSR规范

psr规范php


引言: PSR 是 PHP Standard Recommendations 的简写,由 PHP FIG 组织制定的 PHP 规范,是 PHP 开发的实践标准。这些规范的目的是:经过框架做者或者框架的表明之间讨论,以最低程度的限制,制定一个协做标准,各个框架遵循统一的编码规范,避免各家自行发展的风格阻碍了 PHP 的发展,解决这个程序设计师由来已久的困扰。截止到笔者文章psr在用的共11套规范,下面介绍了其中四个和已经弃用的psr0规范。缓存

PSR-0 (Autoloading Standard) 自动加载标准 (2014年10月21起被官方弃用 由psr4替代)
PSR-1 (Basic Coding Standard) 基础编码标准 
PSR-2 (Coding Style Guide) 编码风格向导 
PSR-3 (Logger Interface) 日志接口 
PSR-4 (Improved Autoloading) 自动加载的在用版本。
#注:另有psr6(缓存接口规范)psr7(HTTP消息接口规范)psr十一、psr1三、psr1五、psr1六、psr17本文不作介绍

附上官网地址psr框架

psr0(官方已废弃)

自动加载标准ide

  1. 一个彻底合格的namespace和class必须符合这样的结构:“< Vendor Name>(< Namespace>)*< Class Name>”
  2. 每一个namespace必须有一个顶层的namespace("Vendor Name"提供者名字)
  3. 每一个namespace能够有多个子namespace
  4. 当从文件系统中加载时,每一个namespace的分隔符(/)要转换成DIRECTORY_SEPARATOR(操做系统路径分隔符)
  5. 在类名中,每一个下划线要转换成DIRECTORY_SEPARATOR(操做系统路径分隔符)。在namespace中,下划线是没有(特殊)意义的。
  6. 当从文件系统中载入时,合格的namespace和class必定是以 .php 结尾的verdor name,namespaces,class名能够由大小写字母组合而成(大小写敏感的)

注:由于已经废弃,这里再也不多作介绍函数

psr4

这里先介绍psr4,好和上面的psr0做对比,由于他是升级版的PSR-0自动加载规范
PSR4是关于由文件路径自动载入对应的类的相关规范,本规范是可互操做的。能够做为任一自动(包括PSR-0)载入规范的补充,此外,PSR4还包括自动载入的类对应的文件存放路径规范。ui

此处的“类”泛指全部的class类、接口、traits可复用代码块以及其余相似结构。
一个完整的类名须要具备如下结构
<命名空间> ( <子命名空间> )* <类名> 编码

  1. 完整的类名必需要有一个顶级命名空间,被称为“Vendor namespace”
  2. 完整的类名能够有一个或多个子命名空间
  3. 完整的类名必须有一个最终的类名
  4. 完整的类名中任意一部分中的下划线都是没有特殊意义的
  5. 完整的类名能够由任意大小写字母组成
  6. 全部类名都必须是大小写敏感的

当根据完整的类名载入相应的文件spa

  1. 完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,做为“命名空间前缀”,其必须至少对应一个基础目录。
  2. 紧接命名空间前缀后的子命名空间必须与相对应的“基础目录”的子目录相匹配,其中的命名空间分隔符做为目录分割符
  3. 末尾的类名必须与对应的.php为后缀的文件同名
  4. 自动加载器(autoloader)的实现必定不能抛出异常,必定不能触发任一级别的错误信息以及不该该有返回值。

例如:操作系统

#完整的类名为
\a\b\c\Log
#命名空间前缀前缀为:
a\b
#前缀对应的基础目录为:
./vendor
#文件实际目录为:
./vendor/c/Log.php
#注:即把去掉最前面的命名空间分隔符后的a\b\c\Log中的命名空间前缀替换成基础目录,而后把命名空间分隔符替换成目录分隔符,并把文件名补上后缀 .php 。

PSR-4和PSR-0最大的区别是对下划线(underscore)的定义不一样。PSR-4中,在类名中使用下划线没有任何特殊含义。而PSR-0则规定类名中的下划线_会被转化成目录分隔符。debug

psr1 基本代码规范

  1. PHP源文件必须只使用 <?php 和 <?= 这两种标签。(php标记有多种方式)
  2. 源文件中php代码的编码格式必须是不带字节顺序标记(BOM)的UTF-8。(注:PHP在设计时就没有考虑BOM的问题,也就是说他不会忽略UTF-8编码的文件开头BOM的那三个字节致使出现奇怪的错误。)
  3. 一个源文件建议只用来作声明(类(class),函数(function),常量(constant)等)或者只用来作一些引发从属效应的操做(例如:输出信息,包含文件,修改.ini配置等),但不能同时使用二者。
    注:“从属效应”(side effects)一词的意思是,仅仅经过包含文件,不直接声明类、函数和常量等,而执行的逻辑操做。 “从属效应”包含却不只限于:生成输出、直接的 require 或 include、链接外部服务、修改 ini 配置、抛出错误或异常、修改全局或静态变量、读或写文件等。 这个不少人都不遵照,可是基本上全部框架里都不会把修改.ini配置和声明类或函数放到一块儿,好比框架index.php入口文件只定义宏常量和修改.ini等

  4. 命名空间(namespace)和类(class) 必须遵照PSR0或psr4标准。
  5. 类名(class name) 必须使用骆驼式(StudlyCaps)写法(注:StudlyCaps即首字母大写驼峰式)。
  6. 类(class)中的常量必须只由大写字母和下划线组成。
  7. 方法名(method name) 必须使用驼峰式(cameCase)写法。

psr2 代码风格

  1. 代码必须遵循PSR-1中的编码规范
  2. 代码必须使用四个空格符而不是tab键进行缩进。
  3. 每行的字符数应该软性保持在80个内,理论上不可多于120个,但必定不能硬性限制
  4. 每一个namespace命名空间声明语句和use语句块后面,必须插入一个空白行
  5. 类的开始花括号必须在类声明后自成一行,结束花名号也必须在类主体后自成一行
  6. 函数的开始花括号必须在函数声明后自成一行,结束花名号也必须在函数主体后自成一行
  7. 类的属性和方法必须添加访问修饰符(private protected以及public),abstract以及final必须声明在访问修饰符以前,而static必须声明在访问修饰符以后。
  8. 控制结构的关键字后必需要有一个空格符,而调用方法或函数时则必定不能有。
  9. 控制结构的开始花括号必须写在声明的同一行,而结束花括号必须写在主体后自成一行。
  10. 控制结构的开始左括号后和结束右括号前,都必定不能有空格符。
    示例代码
<?php
    namespace Vendor\Package;
    
    use FooInterface;
    use BarClass as Bar;
    use OtherVendor\OtherPackage\BazClass;
    
    class Foo extends Bar implements FooInterface
    {
        public function sampleMethod($a, $b = null)
        {
            if ($a === $b) {
                bar();
            } elseif ($a > $b) {
                $foo->bar($arg1);
            } else {
                BazClass::bar($arg2, $arg3);
            }
        }
    
        final public static function bar()
        {
            // method body
        }
    }

一般还有如下几点须要注意

对于php文件:

  • 全部的php文件都必须以Unix LF(换行)做为结束符
  • 全部的php文件都必须以一个单独的空行结尾
  • 纯PHP代码源文件的关闭标签?>必须省略。

关键字和 True/False/Null

  • php的关键字,必须小写
  • php产量 true ,false,null也必须小写

命名空间

  • 命名空间(namespace)的声明后面必须有一行空行。
  • 全部的导入(use)声明必须放在命名空间(namespace)声明的下面。
  • 一句声明中,必须只有一个导入(use)关键字。
  • 在导入(use)声明代码块后面必须有一行空行。

例如:

<?php
namespace Vendor\Package;

use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

// ... additional PHP code ...

控制结构

if ,else ,elseif ,while ,do while ,switch case ,for, foreach,try catch等。这一类的写法规范也是常常容易出现问题的,也要规范一下。在关键字和后面的判断条件中间应该加空格,在判断条件和左大括号之间也要加空格。

psr3日志接口规范

本规范的主要目的,是为了让类库以简单通用的方式接收一个Psr\Log\LoggerInterface对象,来记录日志信息。框架以及CMS内容管理系统若有须要,能够扩展接口以用于它们本身的
目的,但须遵循本规范,才能在使用第三方的类库文件时,保证日志接口仍能正常对接。

LoggerInterface 接口对外定义了八个方法,分别用来记录RFC 5424中定义的八个级别:debug、info、notice、warning、error、critical、alert,emergency。

第九个方法-log,其第一个参数为日志的等级,可以使用一个预约义好的等级常量做为参数来调用此方法,必须与直接调用以上八个方法具备相同的效果。若是传入的等级常量参数没有预先定义,就必须抛出Psr\Log\InvalidArgumentException类型的异常,在不肯定的状况下,使用者不应使用未支持的等级常量来调用此方法。若是有用过monolog就应该对这里有较深的理解。

例如,日志等级能够定义以下:

<?php
    
    namespace Psr\Log;
    
    /**
     * Describes log levels
     */
    class LogLevel
    {
        const EMERGENCY = 'emergency';
        const ALERT     = 'alert';
        const CRITICAL  = 'critical';
        const ERROR     = 'error';
        const WARNING   = 'warning';
        const NOTICE    = 'notice';
        const INFO      = 'info';
        const DEBUG     = 'debug';
    }

日志这里想必你们接触的也很少,若是想了解能够看一看monolog的源码。 本文到此就结束,但愿你们get到了想要的知识。

相关文章
相关标签/搜索