一、PSR规范整理
PHP 已有的编码规范如下
https://blog.csdn.net/qq_40876291/article/details/103848172
1.1 基本编码规范:PSR1
官网规范链接 https://www.php-fig.org/psr/psr-1/
- 文件只能使用<?php和<?=标记。
- 文件必须仅使用UTF-8,而不使用BOM用于PHP代码。
- 文件应该要么声明符号(类、函数、常量等),要么引起副作用(例如,生成输出、更改Ini 设置等) ,但不应同时包含这两项操作
- 命名空间和类必须遵循"自动加载" PSR:[ PSR-0,PSR-4 ]。
- 类名必须在以驼峰大小写格式命名。(首字母及所有子字首字母都大写,示例 StudlyCaps )
- 类常量所有字母必须为大写,子字之间用下划线分隔。
- 方法名必须以驼峰式声明。(首字母小写,所有子字首的字母都大写,示例 studlyCaps )
1.2 PSR2 编码风格指南(已废弃)
官网规范链接 https://www.php-fig.org/psr/psr-2/
- 代码必须遵照 PSR-1。
- 函数代码必须使用4个空格的缩进,而不是制表符。
- 一行代码长度不该硬性限制;软限制必须为120个字符;应为80个字符或者更少。
- 在namespace声明下面必须有一个空行,而且use声明代码块下面也必须有一个空行。
- 类的左花括号必须放到下一行,右花括号必须放在类主体的下一行。
- 方法的左花括号必须放在下一行,右花括号必须放在方法主体下面。
- 全部的属性和方法必须有可见性(即:Public, Protect,
Private)声明;abstract和final声明必须在可见性以前;static声明必须在可见性以后。 - 控制结构的关键词必须在后面有一个空格; 方法和函数不可有。
- 控制结构的左花括号必须放在同一行,右花括号必须放在控制主体的下一行。
- 控制结构的左括号后面不可有空格,右括号以前不可有空格。
1.3 PSR12 扩展编码规范
官网规范链接 https://www.php-fig.org/psr/psr-12/
1.3.1 基本编码标准
代码必须遵循PSR-1中列出的所有规则。
1.3.2 文件
- 所有PHP文件必须仅使用Unix LF(换行)行结尾。
- 所有PHP文件必须以非空白行结束,以单个LF结束。
- ?>必须从仅包含PHP的文件中省略结束标记。
1.3.3 行
- 行长度不得有硬性限制。
- 行长度的软限制必须是120个字符。
- 行不应超过80个字符; 超过的行应该被分成多个后续行,每行不超过80个字符。
- 在行的末尾不得有尾随空格。
- 可以添加空行以提高可读性并指示相关的代码块,除非明确禁止。
- 每行不得超过一个语句。
1.3.4缩进
代码必须为每个缩进级别使用4个空格的缩进,并且不得使用制表符进行缩进。
1.3.5关键字和类型
- 所有PHP保留的关键字和类型必须是小写的。
- 添加到未来PHP版本的任何新类型和关键字必须是小写的。
- 类型的关键字的简短形式必须是即使用bool代替boolean, int而不是integer等
1.3.6.声明语句,命名空间和导入语句
PHP文件的标头可能包含许多不同的块。如果存在,下面的每个块必须用一个空行分隔,并且不得包含空行。尽管可以省略不相关的块,但每个块必须按下面列出的顺序排列。
- 打开<?php标签。
- 文件级docblock。
- 一个或多个声明语句。
- 文件的命名空间声明。
- 一个或多个基于类的use import语句。
- 一个或多个基于函数的use import语句。
- 一个或多个基于常量的use import语句。
- 文件中的其余代码。
当文件包含HTML和PHP的混合时,仍可以使用上述任何部分。如果是这样,它们必须出现在文件的顶部,即使代码的其余部分包含一个结束的PHP标记,然后是HTML和PHP的混合。
当开始<?php 标记位于文件的第一行时,它必须在它自己的行上而没有其他语句,除非它是包含PHP开始和结束标记之外的标记的文件。
导入语句绝不能以前导反斜杠开头,因为它们必须始终是完全限定的。
1.4 自动加载规范:PSR0(已废弃)
- 一个完全合格的namespace和class必须符合这样的结构:"< Vendor Name>(< Namespace>)*< Class Name>"
- 每个namespace必须有一个顶层的namespace("Vendor Name"提供者名字)
- 每个namespace可以有多个子namespace
- 当从文件系统中加载时,每个namespace的分隔符(/)要转换成DIRECTORY_SEPARATOR(操作系统路径分隔符)
- 在类名中,每个下划线()符号要转换成DIRECTORY_SEPARATOR(操作系统路径分隔符)。在namespace中,下划线()符号是没有(特殊)意义的。
- 当从文件系统中载入时,合格的namespace和class一定是以 .php 结尾的
- verdor name,namespaces,class名可以由大小写字母组合而成(大小写敏感的)
1.5 自动加载规范 PSR4
官网规范链接 https://www.php-fig.org/psr/psr-4/
PSR-4 描述了从文件路径中 自动加载 类的规范。 它拥有非常好的兼容性,并且可以在任何自动加载规范中使用,包括 PSR-0。 PSR-4 规范也描述了放置 autoload 文件(就是我们经常引入的 vendor/autoload.php)的位置。
1.5.1 术语
「class」指的是类(classes)、接口(interfaces)、特征(traits)和其他类似的结构。
全限定类名具有以下形式:
<NamespaceName>(<SubNamespaceNames>)*<ClassName>
全限定类名必须拥有一个顶级命名空间名称,也称为供应商命名空间(vendor namespace)。
全限定类名可以有一个或者多个子命名空间名称。
全限定类名必须有一个最终的类名(我想意思应该是你不能这样 <NamespaceName>(<SubNamespaceNames>)*\ 来表示一个完整的类)。
下划线在全限定类名中没有任何特殊含义(在 PSR-0 中下划是有含义的)。
全限定类名可以是任意大小写字母的组合。
所有类名的引用必须区分大小写。
全限定类名的加载过程
在全限定的类名(一个「命名空间前缀」)中,一个或多个前导命名空间和子命名空间组成的连续命名空间,不包括前导命名空间的分隔符,至少对应一个「根目录」。
「命名空间前缀」后面的相邻子命名空间与根目录下的目录名称相对应(且必须区分大小写),其中命名空间的分隔符表示目录分隔符。
最终的类名与以.php 结尾的文件名保持一致,这个文件的名字必须和最终的类名相匹配(意思就是如果类名是 FooController,那么这个类所在的文件名必须是 FooController.php)。
自动加载文件禁止抛出异常,禁止出现任何级别的错误,也不建议有返回值。
二、sonar 对PHP 编码规范的支持
用codesniffer 进行代码规范检查,命令如下
- ./vendor/bin/phpcs --colors --standard=PSR1,PSR12 --encoding=utf-8 --tab-width=4 ./src
规范包括 PSR1 + PSR12 + utf-8编码 + tab用4个空白符表示
目前 sonarqube 内置的PHP编码规则集包括
- Drupal 21条规则
- PSR-2 20条规则
- Sonar way 161条规则
其中Sonar way 为默认的规则
由于PSR2 涵盖了PSR1,并且包含了 utf-8编码,tab用4个空白符表示这两点,所以主要就是看 PSR12的支持情况。
参考
PHP 技术论坛文档:《PHP PSR 标准规范》 https://learnku.com/docs/psr/psr-4-autoloader/1608