编码风格
与编码风格相关并已经通过的提案有 3 个:
- PSR-1: 基本编码标准
- PSR-12: 扩展编码风格指南
- PER: 编码风格
一、编码风格概览
PSR-1: 基本编码标准
PHP 代码文件
必须以<?php或<?=标签开始;PHP 代码文件
必须以不带 BOM 的 UTF-8编码;PHP 代码文件
应该只做 1 件事:声明任意1种标志或引起副作用;什么是
标志,如:类、函数、常量等。什么是
副作用,如:- 生成输出
- 显式使用
require或include - 连接到外部服务
- 修改 ini 设置
- 发出错误或异常
- 修改全局或静态变量
- 从文件中阅读或写入文件
- 还有其他...
php// 「副作用」:修改 ini 配置 ini_set('error_reporting', E_ALL); // 「副作用」:引入文件 include "file.php"; // 「副作用」:生成输出 echo "<html>\n";
命名空间以及类
必须符合PSR的自动加载规范;PSR-0已废弃,当下是遵循 PSR-4
TIP
遵循
PSR-4标准的内容在 PSR-4 页面详细说明类的命名
必须遵循大写开头的驼峰命名规范;- 如:
User、StudlyCaps
- 如:
类的常量
必须使用下划线分隔符来声明;- 单个字母:
VERSION - 多个字母:
DATE_APPROVED
WARNING
PSR-1没有要求类常量使用大写字母,但是业界普遍使用全大写+下划线来声明类常量- 单个字母:
方法名称
必须遵循小写开头的驼峰命名规范。- 如:
pay、camelCase
TIP
方法是指类里面的function- 如:
属性
可以遵循下面 3 种方式中的任意 1 种:- 大写开头的驼峰式:
$user、$StudlyCaps - 小写开头的驼峰式:
$user、$camelCase - 下划线分隔式:
$user、$camel_case
TIP
属性是指类里面所有$开头的变量,包括:属性范围 类自身属性 类方法里的变量 PSR-1规范要求属性在合理范围内保持统一风格,具体如下:合理范围 说明 整个团队 如: psr团队写的所有 composer 包整个包 单个 composer 包 整个类 单个 class/trait/interface/enum整个方法 同个方法 必须保持统一风格
- 大写开头的驼峰式:
PSR-12: 扩展编码风格指南
代码必须遵循
PSR-1中列出的所有规则;对于 PHP 代码文件:
- 文件没行必须以换行符(Unix LF)结尾;
- 文件最后一行
必须是以换行符(Unix LF)结尾的非空白行; - 仅包含 PHP 代码的文件中,必须省略结尾的
?>标签。
结尾无换行符 结尾有换行符 

代码行:
- 代码行
不能有硬限制; - 代码行的软限制
必须为 120 个字符; - 代码行字符数量
不能超过 80 个,超过该长度的行应拆分为多个后续行; - 代码行结尾
不能是空白; - 代码行
可以添加空行以提高可读性并指示相关的代码块,除非明确禁止; - 1 条代码行
不能有多个语句。
- 代码行
缩进: 代码行
必须以 4 个空格作为缩进。关键词和类型
关键词和类型
必须使用小写;未来可能会添加的关键字和类型也
必须使用小写类型关键词
必须使用缩写:类型 使用 布尔类型 bool整型 int浮点型 float字符串 string数组 array对象 object资源类型 resourceNever neverVoid void相对类型 self/parent/static单例类型 false/trueNULL null
声明、命名空间以及导入
一个 PHP 文件的头部如果包含多个块,则每个块之间
必须用空白行分隔,每个块内不能包含空白行。 所有的块类型都必须按照下面的顺序排列,不存在的块类型则忽略。- PHP 文件开始标签:
<?php; - 文件级文档块;
- 一个或多个声明语句;
- 命名空间声明语句;
- 一个或多个基于类的
use声明语句; - 一个或多个基于方法的
use声明语句; - 一个或多个基于常量的
use声明语句; - 其余代码;
所有区块的完整列表
php<?php /** * This file contains an example of coding styles. */ declare(strict_types=1); namespace Vendor\Package; use Vendor\Package\{ClassA as A, ClassB, ClassC as C}; use Vendor\Package\SomeNamespace\ClassD as D; use Vendor\Package\AnotherNamespace\ClassE as E; use function Vendor\Package\{functionA, functionB, functionC}; use function Another\Vendor\functionD; use const Vendor\Package\{CONSTANT_A, CONSTANT_B, CONSTANT_C}; use const Another\Vendor\CONSTANT_D; /** * FooBar is an example class. */ class FooBar { // ... additional PHP code ... }复合命名空间
深度超过两个的复合命名空间不得使用。
phpuse Vendor\Package\SomeNamespace\{ SubNamespaceOne\ClassA, SubNamespaceOne\ClassB, SubNamespaceTwo\ClassY, ClassZ, };phpuse Vendor\Package\SomeNamespace\{ SubNamespaceOne\AnotherNamespace\ClassA, SubNamespaceOne\ClassB, ClassZ, };- PHP 文件开始标签:
