【千奇百怪】PHP代码质检工具PHPCS分析介绍与使用

【千奇百怪】PHP代码质检工具PHPCS分析介绍与使用

两天,还是在对一个代码质量检测平台维护的时候,遇到了好几个关于PHP质检的需求,而老平台上支持的php在新平台还未实现,于是简单研究了一下php的质检工具,准备接入新平台。

系列文章目录

  • java自定义spotbugs检测器
  • PHP代码质检工具PHPCS分析介绍与使用

介绍

php的编码规范并不集中,目前业界比较流行的是使用PHP CodeSniffer进行代码检测,它包含两类脚本,phpcs 和 phpcbf(GitHub地址)

phpcs

phpcs 脚本对 PHP、JavaScript、CSS 文件定义了一系列的代码规范(通常使用官方的代码规范标准,比如 PHP 的PSR2),能够检测出不符合代码规范的代码并发出警告或报错(可设置报错等级)。

phpcbf

phpcbf 脚本能自动修正代码格式上不符合规范的部分。比如 PSR2 规范中对每一个 PHP文件的结尾都需要有一行空行,那么运行这个脚本后就能自动在结尾处加上一行空行。

支持的语言

PHP,JS,CSS

功能

内置规则MySource、PEAR、PHPCS、PSR1、PSR2、Squiz和Zend,能够检测出不符合代码规范的代码并发出警告或报错(可设置报错等级)

基于词法分析的局限性,phpcs的大部分都是检查代码的风格类问题,例如:

标签:PHP代码必须使用long <?php?>标签或short-echo <?=?>标签;它不能使用其他标签变体。
字符编码:参数%s在函数中没有用到
:类名必须大写字母开头,类定义的左花括号 { 应另起一行

详情:https://github.com/squizlabs/PHP_CodeSniffer/wiki/Advanced-Usage

原理

PHP CodeSniffer主要通过词法分析的方式将PHP源码解析成TOKEN数组,然后在TOKEN中标记出不符合代码规范的代码位置。这与编译型语言有很大区别,以Java举例,编译型语言的编译过程都是先进行词法分析、语法分析,然后才是编译。在经过语法分析之后,有一个抽象语法树(AST)的概念,算是语法分析的产出,之后的编译过程是编译器在AST基础上进行的,所以编译型语言静态分析一般是针对AST语法树进行分析。而PHP是解释型语言, 解释型语言一般会在运行的时候实时进行编译,PHP词法解析器在解析PHP语言的过程中,PHP 语言的不同部分在内部被表示为类似T_XXX 的类型,这个T_XXX的类型就叫TOKEN,也叫标识符。

PHP官网共119个标识符

在这里插入图片描述

简单了解一下PHP的运行过程

1.传递给php程序需要执行的文件, php程序完成基本的准备工作后启动PHP及Zend引擎, 加载注册的扩展模块。

2.初始化完成后读取脚本文件,Zend引擎对脚本文件进行词法分析,语法分析。然后编译成opcode执行。如果安装了apc之类的opcode缓存, 编译环节可能会被跳过而直接从缓存中读取opcode执行。

在编译过程中,PHP 词法分析会从输入流里边一个字符一个字符的扫描,识别出对应的词素,最后把源文件转换成为一个TOKEN序列。而结合某个TOKEN代号对应的语法以及TOKEN序列的输出,我们就能理解刚才代码词法分析后的TOKEN序列内容,并且能根据序列内容还原源代码。PHP CodeSniffer 就是基于此进行代码检测。

扩展规则

https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties

https://blog.csdn.net/weixin_39982236/article/details/115228905

使用

环境准备:

  • php (7.0.32)
  • composer (2.2.18)

tip:安装 composer的1.x版本必须要和对应的php版本匹配,调研中发现1.x版本已弃用,如果已安装的有 composer的1.x版本可使用 composer self-update 命令更新 (如果更新不到2则需要注意composer.json版本约束配置),php使用7之后,composer最新版即可

如果是首次安装composer,则需要进行全局配置 mv composer.phar /usr/local/bin/composer && chmod +x /usr/local/bin/composer && chomd -R 777 /root/.composer

安装phpcs

执行composer global require “squizlabs/php_codesniffer=*”

执行composer global config bin-dir –absolute 获取 composer 路径

根据路径设置软连接

ln -s composer路径 /phpcs /usr/local/bin/phpcs

ln -s composer路径 /phpcbf /usr/local/bin/phpcbf

执行

配置完成后命令行直接可以使用phpcs命令扫描文件

在这里插入图片描述

常用参数:
检查单个文件/目录:phpcs [文件/目录]

指定报告格式:phpcs =summary /path/to/code ;可用的报告格式有 emacs, source, summary, diff, svnblame, gitblame, hgblame, notifysend,默认为full
| | |
| | |

参数 作用
-i 显示已安装的编码标准
-h 查看帮助
–standard 指定标准
–report 设置报告格式,可用的有full, xml, checkstyle, csv, json等
–report-full 将检测结果写入文件
–config-show 查看配置选项
–config-set 修改配置选项
–report=summary 仅显示每个文件的错误和警告数量的摘要报告
–no-colors 不设置输出的颜色,默认配置
–cache 缓存输出结果
–no-cache 不缓存输出结果,默认配置
–ignore-annotations 忽略代码注释
–report=info 打印详细信息报告
–report=souurce 打印源报告
–report=ocde 打印代码报告

指定标准

参数 –standard 指定的标准有三种:内置标准,其他标准,自定义标准。

内置标准

包括MySource、PEAR、PHPCS、PSR1、PSR2、Squiz和Zend,每种标准针对的各不相同,以PSR为例,phpcs内置PSR1与PSR2,使用时可以直接 –standard=PSR1

PSR-1:基本的编码风格

PSR-2:编码风格(更严格)PSR-2中文说明

PSR-3:日志记录器接口

PSR-4:自动加载

其他标准

为依据项目需要开发的开源标准,以为 CodeIgniter 例( CodeIgniter 是一个应用开发框架和工具包,用于 PHP 开发 Web 网站,这里的CodeIgniter指的是其使用的PHP开发规范) ,想要使用 CodeIgniter 需要先去https://github.com/thomas-ernest/CodeIgniter-for-PHP_CodeSniffer 下载包解压,复制 src 目录到 php->pear->PHP->CodeSniffer→Standards 目录下,并且改名为 CodeIgniter,然后才可以使用:phpcs –standard=CodeIgniter

自定义标准

可以直接通过指定目录进行使用,–standard=D:/PHP_CodeSniffer/src/Standards/FireLine

参考资料:

Github:https://github.com/squizlabs/PHP_CodeSniffer

官方wiki: https://github.com/squizlabs/PHP_CodeSniffer/wiki

                       

点击阅读全文

上一篇 2023年 5月 28日 am11:10
下一篇 2023年 5月 28日 am11:11