转载: https://www.awaimai.com/916.html

PSR是PHP通用性框架小组 (PHP Framework Interop Group) 制定的PHP代码编写格式规范,是PHP开发的事实标准。

截止到目前(2015年2月),正式发布过的PHP规范共有5个:

  • PSR 0 自动加载标准(已废弃,被PSR 4取代)
  • PSR 1 基本代码规范
  • PSR 2 代码风格指南
  • PSR 3 日志接口
  • PSR 4 改进的自动加载

那么使用、遵循PSR标准有什么必要和好处呢?统一的编码风格,可以让我们轻松愉悦地阅读他人的代码,以及编写让他人的代码。

就PSR规范本身来说,个人觉得是非常优秀、简洁的实践结晶。遵循这些标准,除了能使我们的代码更加可读之外,还能让我们的程序更加健壮,更能提高开发者的个人素养。

下面罗列一下PSR 1 ~ PSR 4的主要内容(已废弃的PSR 0不再介绍):

PSR 1 基本代码规范

  • 必须把PHP代码放在 <?php ?><?= ?>标签中。不得使用其他PHP标签句法。
  • 文件编码只使用UTF-8字符集编码,无BOM 格式。
  • 一个源文件可以用来做声明(类、性状、函数、常量等),或者用来做一些有副作用的操作(如输出信息或处理数据),但不建议同时做这两件事。
    应该避免的例子,既包含声明又有副作用
    <?php
    // 副作用:修改了ini配置
    ini_set('error_reporting', E_ALL); // 副作用:载入了文件
    include "file.php"; // 副作用:产生了输出
    echo "<html>\n"; // 声明
    function foo()
    {
    // 函数体
    }

      

    提倡的例子,仅包含声明:

    <?php
    // 声明
    function foo()
    {
    // 函数体
    } // 条件式声明不算做是副作用
    if (! function_exists('bar')) {
    function bar()
    {
    // 函数体
    }
    }

      

  • 一个源文件中只能有一个类,并且每个类至少要有一级命名空间名,即一个顶级的组织名(vendor name)。类名必须使用骆驼式(StulyCase)写法
    <?php
    namespace Vendor\Model; class StudlyCaps
    {
    // 代码
    }

      

  • 类常量必须只由大写字母和下划线(_)组成:
      <?php
    namespace Vendor\Model; class Foo
    {
    const VERSION = '1.0';
    const DATE_APPROVED = '2012-06-01';
    }

      

  • 类属性命名依据喜好选择形如 $StulyCaps$camelCase 或者 $unser_score 的风格,并在一个合理的范围内保持一致。
  • 方法名必须使用驼峰式(camelCase)风格来声明,也就是首字母是小写的,后续单词的首字母都是大写的。

PSR 2 代码风格指南

  • 代码使用4个空格来进行缩进,不使用制表符。
  • PHP文件使用Unix LF(换行)作为行结束符,最后要有一个空行,而且不能使用关闭标签?>(避免意料之外的输出错误)。
  • PHP关键字都应该使用小写字母,如truefalsenull
  • 一行代码的长度不建议有硬限制;软限制必须为120个字符,建议每行代码80个字符或者更少。
  • 在命名空间(namespace)的声明下面必须有一行空行,并且在导入(use)的声明下面也必须有一行空行。
  • 类(class)的左花括号必须放到其声明下面自成一行,右花括号则必须放到类主体下面自成一行。
  • 方法(method)的左花括号必须放到其声明下面自成一行,右花括号则必须放到方法主体的下一行。
  • 所有的属性(property)和方法(method) 必须有可见性声明;抽象(abstract)和终结(final)声明必须在可见性声明之前,而静态(static)声明必须在可见性声明之后。
  • 控制结构的左花括号必须跟其放在同一行,右花括号必须放在该控制结构代码主体的下一行。
    if ($a === true) {
    echo 'yes';
    } else {
    echo 'no';
    }

      

  • 控制结构的左括号之后不可有空格,右括号之前也不可有空格。

PSR 3 日志接口

基础

符合PSR-3推荐规范的PHP日志记录器组件,必须包含一个实现Psr\Log\LoggerInterface接口的PHP类。要实现九个方法:

<?php
namespace Psr\Log; interface LoggerInterface
{
public function emergency($message, array $content = array());
public function alert($message, array $content = array());
public function critical($message, array $content = array());
public function warning($message, array $content = array());
public function notice($message, array $content = array());
public function info($message, array $content = array());
public function debug($message, $array $content = array());
public function log($level, $message, array $content = array());
}

  

  • LoggerInterface 接口对外定义了八个方法,分别用来记录 RFC 5424 中定义的八个等级的日志:debug、 info、 notice、 warning、 error、 critical、 alert 以及 emergency 。
  • 第九个是log方法,其第一个参数为记录的等级。可使用一个预先定义的等级常量作为参数来调用此方法,必须与直接调用以上八个方法具有相同的效果。如果传入的等级常量参数没有预先定义,则必须抛出 Psr\Log\InvalidArgumentException 类型的异常。在不确定的情况下,使用者不该使用未支持的等级常量来调用此方法。

消息

  • 每个方法都接受一个字符串,或者一个有__toString方法的对象作为message参数。实现者可以对传入的对象有特殊的处理。如果没有,实现者 必须将它转换成字符串。
  • $message参数中可能包含一些可以被$context参数的数值所替换的占位符。占位符名字必须和$context数组类型参数的键名对应。占位符名字必须使用一对花括号来作为分隔符。在占位符和分隔符之间不能有任何空格。占位符名字应该只能由A-Za-z0-9_.组成。其它的字符作为以后占位符规范的保留字。实现者可以使用占位符来实现不同的转义和翻译日志成文。因为用户并不知道上下文数据会是什么,所以不推荐提前转义占位符。

上下文

  • 每个方法接受一个数组作为$context参数,用来存储不适合在字符串中填充的信息。数组可以包括任何东西。实现者 必须确保他们尽可能包容的对$context参数进行处理。一个$context参数的给定值不可导致抛出异常,也不可产生任何PHP错误,警告或者提醒。
  • 如果在$context参数中传入了一个异常对象,它必须以exception作为键名。记录异常轨迹是通用的模式,并且可以在日志系统支持的情况下从异常中提取出整个调用栈。实现者在将exception当做异常对象来使用之前必须去验证它是不是一个异常对象,因为它可能包含着任何东西。

助手类和接口

  • Psr\Log\AbstractLogger类可以让你通过继承它,并通用的log方法来方便的实现LoggerInterface接口。而其他八个方法将会把消息和上下文转发给log方法。
  • 类似的,使用Psr\Log\LoggerTrait只需要你实现通用的log方法。注意,特性是不能用来实现接口的,所以你依然需要在你的类中implement LoggerInterface
  • Psr\Log\NullLogger是和接口一起提供的。它在没有可用的日志记录器时,可以为使用日志接口的用户们提供一个后备的“黑洞”。但是,当$context参数的构建非常耗时的时候,直接判断是否需要记录日志可能是个更好的选择。
  • Psr\Log\LoggerAwareInterface只有一个setLogger(LoggerInterface $logger)方法,它可以在框架中用来随意设置一个日志记录器。
  • Psr\Log\LoggerAwareTrait特性可以被用来在各个类中轻松实现相同的接口。通过它可以访问到$this->logger
  • Psr\Log\LogLevel类拥有八个日志等级的常量。
    <?php
    namespace Psr\Log; 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';
    }

      

PSR 4 改进的自动加载

  • 术语「类」是一个泛称,它包含类、接口、trait 以及其他类似的结构;
  • 完全限定类名应该类似如下范例:\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
    • 完全限定类名必须有一个顶级命名空间(Vendor Name);
    • 完全限定类名可以有多个子命名空间;
    • 完全限定类名应该有一个终止类名;
    • 下划线在完全限定类名中是没有特殊含义的;
    • 字母在完全限定类名中可以是任何大小写的组合;
    • 所有类名必须以大小写敏感的方式引用;
  • 当从完全限定类名载入文件时:
    • 在完全限定类名中,连续的一个或几个子命名空间构成的命名空间前缀(不包括顶级命名空间的分隔符),至少对应着至少一个基础目录。
    • 在「命名空间前缀」后的连续子命名空间名称对应一个「基础目录」下的子目录,其中的命名 空间分隔符表示目录分隔符。子目录名称必须和子命名空间名大小写匹配;
    • 终止类名对应一个以 .php 结尾的文件。文件名必须和终止类名大小写匹配;
  • 自动载入器的实现不可抛出任何异常,不可引发任何等级的错误;也不应返回值;

参考资料:

  1. PHP Standards Recommendations
  2. PHP标准化规范PSR 0、PSR 1、PSR 2、PSR 3、PSR 4
  3. PHP编码规范(中文版)

PHP PSR代码规范的更多相关文章

  1. PHP PSR 代码规范基本介绍

    PSR 是 PHP Standard Recommendation 的简写,即PHP推荐标准. 目前通过的规范有 PSR-0(Autoloading Standard).PSR-1(Basic Cod ...

  2. 谈谈PHP代码规范

    [转] http://www.syyong.com/php/Talk-about-PHP-code-specification.html 我向往这样一个php世界,里面没有代码规范之争.你我都一样,都 ...

  3. PHP代码规范

    PHP编码规范 1. 标识符命名规范 标识符的命名力求做到统一.达意和简洁. 1.1 统一 统一是指,对于同一个概念,在程序中用同一种表示方法,比如对于供应商,既可以用supplier,也可以用pro ...

  4. PHP PSR 代码风格

    FIG组织在制定跟PHP相关规范,简称PSR,PSR旨在通过讨论我们代码项目的共同点以找出一个协作编程的方法. 什么是psr0 强调自动加载的方式 下文描述了若要使用一个通用的自动加载器(autolo ...

  5. 漫谈PHP代码规范

    前言 虽说PHP是世界上最好的语言,但是写出来的PHP代码却往往不是最美观的.究其原因,可能正式因为PHP简单易上手,适合快速迭代的特性,导致了我们沉浸在迅速完成需求迭代的窃喜中,却忘记了规范性.忽略 ...

  6. PHP PSR基本代码规范(中文版)

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

  7. 学生导师互选系统(php代码规范)

    学生导师互选系统(php代码规范) php编码规范 组名:一不小心就火了 负责项目:学生导师互选系统(安卓端) 编写目的 为了更好的提高团队的的合作效率,保证开发的有效性和合理性,并可最大程度的提高程 ...

  8. PHP 代码规范

    FIG制定的 PHP 规范,简称 PSR,是 PHP 开发的事实标准.FIG 是 Framework Interoperability Group (框架可互用小组) 的缩写,由几位开源框架的开发者成 ...

  9. php代码规范->如何写出规范且易于理解的项目代码-ZX版

    2019年5月17日10:50:12 前序: 目前是想到哪写到哪,后面有时间在整理成具体文章 很多时候,PHP代码风格过于自由,导致一个项目有N多种写法风格,有些人为了自己认为的技术"高&q ...

随机推荐

  1. vue开发常见命令

    1.安装脚手架 安装脚手架命令:npm install -global vue-cli 2.升级脚手架 有时候需要把整个脚手架升级一下,这个用到命令npm install --global vue-c ...

  2. (转)Spring Boot 2 (七):Spring Boot 如何解决项目启动时初始化资源

    http://www.ityouknow.com/springboot/2018/05/03/spring-boot-commandLineRunner.html 在我们实际工作中,总会遇到这样需求, ...

  3. WINDOWS下nginx实现本地支持的图片服务器反向代理

    最近在学习nginx的反向代理和负载均衡的运用时,觉得挺简单的,但是还是想写一篇博客用于记录自己的学习过程. 好的,我们进入正题 Nginx(engine x) 是一个高性能的HTTP和反向代理服务器 ...

  4. Oracle调整顾问(SQL Tuning Advisor 与 SQL Access Advisor

    在Oracle数据库出现性能问题时,使用Oracle本身的工具包,给出合理的调优建议是比较省力的做法. tuning advisor 是对输入的sql set的执行计划进行优化accsee advis ...

  5. 15.io流,递归

    一.file的常用api 二.算法:递归1.定义:递归算法是把问题转化为规模缩小了的同类问题的子问题.然后递归调用函数(或过程)来表示问题的解.一个过程(或函数)直接或间接调用自己本身,这种过程(或函 ...

  6. Flask框架简介,常用扩展包及两大核心

    Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架. Flask 本身相当于一个内核,其他几乎所有的功能都 ...

  7. Spring Boot 之日志记录

    Spring Boot 之日志记录 Spring Boot 支持集成 Java 世界主流的日志库. 如果对于 Java 日志库不熟悉,可以参考:细说 Java 主流日志工具库 关键词: log4j, ...

  8. JUnit5 快速指南

    JUnit5 快速指南 version: junit5 1. 安装 2. JUnit 注解 3. 编写单元测试 3.1. 基本的单元测试类和方法 3.2. 定制测试类和方法的显示名称 3.3. 断言( ...

  9. java基础 容器 API

  10. Java线程和线程池

    Android中创建线程的方式有,new Thread,new Thread(Runnable),new Thread(Callable)的形式. A. 直接new Thread简单方便. B. ne ...