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

相关推荐
飞飞-躺着更舒服1 小时前
【QT】实现电子飞行显示器(改进版)
开发语言·qt
武昌库里写JAVA1 小时前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
ZSYP-S2 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos2 小时前
c++------------------函数
开发语言·c++
程序员_三木2 小时前
Three.js入门-Raycaster鼠标拾取详解与应用
开发语言·javascript·计算机外设·webgl·three.js
是小崔啊2 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
tianmu_sama2 小时前
[Effective C++]条款38-39 复合和private继承
开发语言·c++
黄公子学安全2 小时前
Java的基础概念(一)
java·开发语言·python
liwulin05062 小时前
【JAVA】Tesseract-OCR截图屏幕指定区域识别0.4.2
java·开发语言·ocr
jackiendsc2 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法