编码风格
与编码风格相关并已经通过的提案有 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
资源类型 resource
Never never
Void void
相对类型 self/parent/static
单例类型 false/true
NULL 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 文件开始标签: