遵循规范写出高质量的PHP代码:PHP推荐标准PSR详解
遵循规范写出高质量的PHP代码:PHP推荐标准PSR详解
相信很多 PHPer 在看博客、开发代码的时候,都接触过 PSR-1、PSR-2、PSR-3、PSR-4 等名词。PSR 是 PHP Standards Recommendation 的缩写,是由 PHP 框架互操作组织(PHP Framework Interop Group)制定和维护的 PHP 代码规范。
长期以来,PHP 由于入门简单,注重于解决问题,在代码的严谨性、规范性等方面有所不足。各个框架没有共同可遵守的编码规范,从而导致代码风格不一致、框架之间的相互通信和交互比较困难等问题。正是看到了这种弊端,PHP-FIG 应用而生,制定了 PSR 标准,为 PHPer 编写高质量的代码打下了良好的基础。
再加上 Composer 包管理器的普及,使得 PSR 开发的组件化程度大为提高,生态环境迅速优化。
目前 PSR 共有四个推荐标准,即 PSR-1、PSR-2、PSR-3、PSR-4(之前有 PSR-0,现被废弃,有PSR-4代替)。在此,我想说的是,虽然你不按这个标准写代码也没什么,同样能完成既定的任务,但遵循良好的代码规范,让其他人很好理解你的代码是非常值得鼓励的事情。现在很多框架和组件都遵循 PSR规范。在此,我们分别进行简单的介绍,希望对大家有所帮助。
一、 PSR-1 基本编码规范
PSR-1 又称基本代码规范,非常简单,规定了最基础的编码规则,包括文件名、类名、方法名、文件编码等基础内容,遵循起来非常简单,也许你在日常使用中已经自觉或者不自觉的遵循了这些规则,下面我们简单重温一下:
虽然 PHP 代码有多种标识符,比如<?php ?>、<? ?>、、<% %>,但只建议使用 <?php ?> 和 <?= ?> 两种。
源文件应为 UTF-8 编码,且不包含字节顺序标记(BOM)。
一个PHP文件可以定义类、函数、常量等符号,也可以做一些诸如生成结果、处理数据等带副作用的操作,但不建议同时做这两种事情。
PHP 命名空间和类必须符合 PSR-4 自动加载器标准。
PHP 类应采用首字母大写的驼峰式命名,比如 UserProfile。
PHP 常量名称全部采用大写,如需要,中间可用下划线分割,比如 RETRY_COUNT。
PHP 方法名称应采用首字母为小写的驼峰式命名,比如 checkPassword。
二、 PSR-2 代码风格
PSR-2,又称 Coding Style Guide, 即代码风格。是在 PSR-1 的基础上,对代码缩进、长度、换行、方法可见性声明、空格和方法体大括号换行等内容做出了进一步的规定。这个标准我个人觉得非常必要,因为 PHP 一直以来就非常缺乏一个统一的代码风格规定,每个人写出来的代码风格都不一样,增加了理解的难度。主要有以下内容:
遵循 PSR-2 的前提条件是遵循 PSR-1。
缩进采用四个空格的方式,不采用制表符缩进。
采用 Unix 而非 Windows 风格的换行符,最后要有一个空行,且不使用 ?> PHP 关闭标签。每行代码不超过80个字符,至少不能超过120个字符。
所有的 PHP 关键词采用小写方式,比如 true,false。
命名空间申明后必须有一个空行,引入命名空间时,最后一个 use 语句后也要加空行。
定义类时,extends、implements 关键词和类名写在同一行,但起始花括号和结束花括号必须新起一行。
定义方法时,起始花括号和结束花括号必须新起一行;定义参数时,起始圆括号之后和结束圆括号之间无空格,方法的每个参数后有一个逗号和空格。
类中的每个方法和属性都必须申明可见性,即 public、protected、private。如果把类属性和方法申明为 abstract 或 final,这两个限定符必须在可见性关键词之前。若定义为 static,则在可见性关键词之后。
所有的控制结构,比如 if、for、switch 后面必须加一个空格,其实圆括号之后和结束圆括号之前不能有空格,且必须和起始花括号在同一行,但结束花括号必须新起一行。
三、 PSR-3 日志记录器
日志记录是编程中常用的功能,对此 PSR-3 定义了日志记录器应该遵循的接口。在此我们不详细介绍,因为通常情况下,我们不用自己写日志记录器,有很多非常强大、健壮、优雅的开源日志记录器,我们只要拿来使用即可。但是在选择日志记录器的时候,一定要看其是否遵循了 PSR-3 标准。
这里笔者向大家强烈推荐 Monolog,非常强大的日志记录器组件,应该能满足的一切需求。就算你有特殊的需求,也可以很方便的扩展它从而实现自定义的报告逻辑。
四、 PSR-4 自动加载器
以前,我们编写 PHP 时,会大量使用到 include()、require() 等函数,这在小规模程序下是可行的,但随着程序规模的扩大,依赖关系会迅速复杂化,这些函数就很难胜任了,且性能优化难以进行。
幸好,PHP 有了自动加载器,让我们无须手动引入 PHP 文件,而是根据类名自动加载策略找到相应的 PHP 类,于是整个世界通透了。
但是,还有一个问题,许多框架和工程都定义了一套自己的加载器策略,使用不同的逻辑查找 PHP 类,不利于构建自动化的依赖管理系统。
因此,制定了统一的自动加载器规则,只要遵循 PSR-4,利用 Composer ,就可以以统一的方式管理以来,用起来真是很爽。