sonarqube PHP编码规范检查

一、PSR规范整理

PHP 已有的编码规范如下

https://blog.csdn.net/qq_40876291/article/details/103848172

1.1 基本编码规范:PSR1

官网规范链接 https://www.php-fig.org/psr/psr-1/

  1. 文件只能使用<?php和<?=标记。
  2. 文件必须仅使用UTF-8,而不使用BOM用于PHP代码。
  3. 文件应该要么声明符号(类、函数、常量等),要么引起副作用(例如,生成输出、更改Ini 设置等) ,但不应同时包含这两项操作
  4. 命名空间和类必须遵循"自动加载" PSR:[ PSR-0,PSR-4 ]。
  5. 类名必须在以驼峰大小写格式命名。(首字母及所有子字首字母都大写,示例 StudlyCaps )
  6. 类常量所有字母必须为大写,子字之间用下划线分隔。
  7. 方法名必须以驼峰式声明。(首字母小写,所有子字首的字母都大写,示例 studlyCaps )

1.2 PSR2 编码风格指南(已废弃)

官网规范链接 https://www.php-fig.org/psr/psr-2/

  1. 代码必须遵照 PSR-1。
  2. 函数代码必须使用4个空格的缩进,而不是制表符。
  3. 一行代码长度不该硬性限制;软限制必须为120个字符;应为80个字符或者更少。
  4. 在namespace声明下面必须有一个空行,而且use声明代码块下面也必须有一个空行。
  5. 类的左花括号必须放到下一行,右花括号必须放在类主体的下一行。
  6. 方法的左花括号必须放在下一行,右花括号必须放在方法主体下面。
  7. 全部的属性和方法必须有可见性(即:Public, Protect,
    Private)声明;abstract和final声明必须在可见性以前;static声明必须在可见性以后。
  8. 控制结构的关键词必须在后面有一个空格; 方法和函数不可有。
  9. 控制结构的左花括号必须放在同一行,右花括号必须放在控制主体的下一行。
  10. 控制结构的左括号后面不可有空格,右括号以前不可有空格。

1.3 PSR12 扩展编码规范

官网规范链接 https://www.php-fig.org/psr/psr-12/

1.3.1 基本编码标准

代码必须遵循PSR-1中列出的所有规则。

1.3.2 文件

  1. 所有PHP文件必须仅使用Unix LF(换行)行结尾。
  2. 所有PHP文件必须以非空白行结束,以单个LF结束。
  3. ?>必须从仅包含PHP的文件中省略结束标记。

1.3.3 行

  1. 行长度不得有硬性限制。
  2. 行长度的软限制必须是120个字符。
  3. 行不应超过80个字符; 超过的行应该被分成多个后续行,每行不超过80个字符。
  4. 在行的末尾不得有尾随空格。
  5. 可以添加空行以提高可读性并指示相关的代码块,除非明确禁止。
  6. 每行不得超过一个语句。

1.3.4缩进

代码必须为每个缩进级别使用4个空格的缩进,并且不得使用制表符进行缩进。

1.3.5关键字和类型

  1. 所有PHP保留的关键字和类型必须是小写的。
  2. 添加到未来PHP版本的任何新类型和关键字必须是小写的。
  3. 类型的关键字的简短形式必须是即使用bool代替boolean, int而不是integer等

1.3.6.声明语句,命名空间和导入语句

PHP文件的标头可能包含许多不同的块。如果存在,下面的每个块必须用一个空行分隔,并且不得包含空行。尽管可以省略不相关的块,但每个块必须按下面列出的顺序排列。

  1. 打开<?php标签。
  2. 文件级docblock。
  3. 一个或多个声明语句。
  4. 文件的命名空间声明。
  5. 一个或多个基于类的use import语句。
  6. 一个或多个基于函数的use import语句。
  7. 一个或多个基于常量的use import语句。
  8. 文件中的其余代码。

当文件包含HTML和PHP的混合时,仍可以使用上述任何部分。如果是这样,它们必须出现在文件的顶部,即使代码的其余部分包含一个结束的PHP标记,然后是HTML和PHP的混合。

当开始<?php 标记位于文件的第一行时,它必须在它自己的行上而没有其他语句,除非它是包含PHP开始和结束标记之外的标记的文件。

导入语句绝不能以前导反斜杠开头,因为它们必须始终是完全限定的。

1.4 自动加载规范:PSR0(已废弃)

  1. 一个完全合格的namespace和class必须符合这样的结构:"< Vendor Name>(< Namespace>)*< Class Name>"
  2. 每个namespace必须有一个顶层的namespace("Vendor Name"提供者名字)
  3. 每个namespace可以有多个子namespace
  4. 当从文件系统中加载时,每个namespace的分隔符(/)要转换成DIRECTORY_SEPARATOR(操作系统路径分隔符)
  5. 在类名中,每个下划线()符号要转换成DIRECTORY_SEPARATOR(操作系统路径分隔符)。在namespace中,下划线()符号是没有(特殊)意义的。
  6. 当从文件系统中载入时,合格的namespace和class一定是以 .php 结尾的
  7. 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编码规则集包括

  1. Drupal 21条规则
  2. PSR-2 20条规则
  3. Sonar way 161条规则

其中Sonar way 为默认的规则

由于PSR2 涵盖了PSR1,并且包含了 utf-8编码,tab用4个空白符表示这两点,所以主要就是看 PSR12的支持情况。

参考

PHP 技术论坛文档:《PHP PSR 标准规范》 https://learnku.com/docs/psr/psr-4-autoloader/1608

相关推荐
BingoGo1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1234 天前
matlab画图工具
开发语言·matlab
dustcell.4 天前
haproxy七层代理
java·开发语言·前端