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

2023-10-30

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

系列文章目录


介绍

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • PHP邮件功能有时可以工作

    我正在编写一个脚本 需要通过PHP邮件功能发送电子邮件 如下所示 它在向 gmail 帐户发送电子邮件时有效 但在我的域中的帐户却无效 我们正在运行 Exchange 服务器 截至目前 电子邮件是从 www server 发送的 有谁知道
  • 学说“没有命名的协会”

    将我添加到无法找出其学说映射出了什么问题的人列表中 我正在模拟国际象棋Game与一对多Halfmoves 有任何想法吗 DDL create table game game id int primary key create table h
  • php 崩溃后 mysql 表被锁定

    我有一个 MySQL DB 和一个 innoDB 表 我有一个 php 页面 用于连接 锁定表 进行一些更新 然后解锁表 PHP 页面通过 wamp 与 apache 一起提供 php页面将文件上传到数据库 我决定通过上传一个大小大于分配给
  • 如何在 Laravel 中创建一条包罗万象的路线

    我需要一个 Laravelroutes php将捕获所有流量到特定的条目example com premium section网站 以便我可以提示人们在访问优质内容之前成为会员 您还可以通过在参数上使用正则表达式来捕获 全部 Route g
  • Smarty 3 或更早版本中有类似 Dwoo-s {with} 或 {loop} 的东西吗?

    Dwoo 模板引擎中的 with 和 loop 插件更改变量名称解析的默认上下文 如果在 Dwoo 中您提供模板 arr foo with arr foo arr foo with 有数据 array arr gt array foo gt
  • 从文本块中提取相关标签/关键字

    我想要一个特定的实现 以便用户提供如下文本块 要求 使用 Linux Apache 2 的 LAMP 环境的工作知识 MySQL 5 和 PHP 5 Web 2 0 标准知识 熟悉 JSON 使用框架 Zend OOP 的实践经验 跨浏览器
  • Laravel 验证:存在附加列条件 - 自定义验证规则

    在 Laravel 中指定存在验证规则时 是否有一种方法可以引用另一个字段 我希望能够说输入 a 必须存在于表 a 中 输入 b 必须存在于表 b 中 并且表 b 中列 x 的值必须等于输入 a 最好通过例子来解释 public rules
  • 基本表创建 fpdf

    我找不到使用 fpdf 制作表格并从 mysql 数据库获取数据的合适教程 我只是想知道如何创建一个 我在网上尝试示例时遇到了很多错误 例如 我有 名字 中间名 姓氏 年龄 和 电子邮件 列 如何使用 fpdf 创建表格并回显数据库中的条目
  • 从 PDO 准备好的语句中获取原始 SQL 查询字符串

    在准备好的语句上调用 PDOStatement execute 时 有没有办法让原始 SQL 字符串执行 出于调试目的 这将非常有用 我假设您的意思是您想要最终的 SQL 查询 并将参数值插入其中 我知道这对于调试很有用 但这不是准备好的语
  • Opencart最低下单价不包括一类

    我正在使用 opencart 并成功为所有交易添加了最低订单价格 这是我使用的代码 div div div class warning Minimum 10 Euro to checkout div 现在我想从中排除一个类别 以便可以购买该
  • 根据通过 AJAX 请求的用户输入重绘 google 图表

    我有一个谷歌图表从我的数据库中提取数据 它可以按我想要的方式工作 根据 URL 中的 get 请求 它从所选表中提取数据 我想根据下拉菜单中选定的表通过 ajax 更新此图表 我无法突破的部分是通过 ajax 获取数据响应 我认为下面的代码
  • 如何从控制器访问 Zend Framework 应用程序的配置?

    我有一个基于 Zend 框架的应用程序快速开始 http framework zend com docs quickstart setup 我已经让演示工作起来 现在正在实例化一个新的模型类来完成一些实际工作 在我的控制器中 我想将配置参数
  • PHP mkdir() 和 fopen() 不起作用 - 权限问题? umask问题?

    以下 PHP 脚本无法创建目录 它也将无法创建文件 当目录已经存在时 ini set error reporting E ALL define ABSPATH SERVER DOCUMENT ROOT echo ABSPATH br br
  • Twig:选择某些块并渲染它们

    我正在将 twig 模板引擎集成到 PHP 应用程序中 特别是 我想使用 twig 引擎来渲染表单 了解了 symfony2 如何使用 twig 渲染表单小部件后 他们有一个巨大的模板文件 其中包含所有小部件 如下所示 block pass
  • 如何在 Laravel 代码中使用 Artisan 命令?

    如何在我的 php caode Ex 中使用 Artisan 命令行 php artisan version to 您可以从控制器调用 Artisan 命令 如下所示 calling of migrate install Artisan c
  • 在 Apache 服务器上将特定的 .htm 页面处理为 .php [重复]

    这个问题在这里已经有答案了 我正在为 Apache 服务器编程 并且只需要将一个特定的 html 页面 例如 first htm 作为 PHP 脚本进行处理 可以设置吗 SetHandler http httpd apache org do
  • 从数据库 MYSQL 和 Codeigniter 获取信息

    如果你们需要其他信息 上一个问题就在这里 从数据库中获取信息 https stackoverflow com questions 13336744 fetching information from the database 另一个更新 尽
  • laravel 5.4 在请求验证之前修改数据[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我有我的自定义请求 它扩展了 Backpack CrudController 现在我想重写 ValidatesWhenResolv
  • 通过ajax执行后期操作时如何克服CORS重定向问题?

    我可以通过外部登录表单中的 post 方法类型提交表单来登录 roundcube 实例 托管在另一台服务器上 我收到此错误 通过 ajax 签名时 XMLHttpRequest 无法加载https 192 168 0 7 mail http
  • PHP 文件服务脚本:下载不可靠?

    这篇文章最初是关于 ServerFault 的一个问题 https serverfault com questions 131156 user receiving partial downloads https serverfault co

随机推荐

  • 用git和idea推送本地项目到远程仓库

    方式一 git命令方式 1 鼠标右键 Git Bash Here 2 初始化仓库 git init 3 配置签名 git config user name Zhang3 git config user email zhang3 163 co
  • WebFlux出现接口已返回成功,但查询时数据未改变的问题

    问题描述 在使用WebFlux时遇到一个很奇怪的问题 先调用禁用账号接口 接着在进行查询该数据 结果页面显示数据未改变 在点一次时页面数据才刷新 即连续点两次查询接口 才能看到修改后的数据 相关代码 前端 const disableAcco
  • 商城登录后端

    二 登录 1 用户名和密码 用户名和密码的格式验证可以不需要在后端进行 在前端服务器判断就可以 2 图片验证码与验证 import string redis from captcha image import ImageCaptcha cl
  • Email Error - You have exceeded the storage limit on your mailbox

    Description You may receive an error You have exceeded the storage limit on your mailbox Delete some items from your mai
  • 前端--三种插件用来解析mardowm,转化成为html语法

    前端 三种插件用来解析mardowm 转化成为html语法 使用方式十分简单 快捷 参考地址 1 markdown js 下载地址 https github com evilstreak markdown js div div
  • IBCS虚拟专线公网IP在公司内部搭建ERP系统按教程

    企业资源计划 ERP 系统是现代企业不可或缺的组成部分 可以将各个业务领域的信息整合到一个系统中 以实现信息共享 协调和协作 然而 随着企业规模的扩大 企业的ERP系统也需要相应地进行升级和扩展 因此 使用IBCS虚拟专线公网IP在公司内部
  • 五. Zuul 限流

    目录 一 spring cloud zuul ratelimit 基础解释 二 实现案例 1 pom 添加依赖 2 yml 配置 3 redis 配置类 4 自定义Zuul过滤器 5 自定义限流策略key 6 在当前Zuul服务中编写Con
  • string查找和替换

    string查找和替换 查找 查找指定字符串是否存在 替换 在指定的位置替换字符串 函数原型 int find const string str int pos 0 const 查找str第一次出现位置 从pos开始查找 int find
  • python读取串口数据 绘图_3.使用串口读取IMU数据并通过话题发布

    0x00 简介 我们的IMU扩展板是支持通过串口方式来读取IMU数据 现在代码已经开发完成 前面文章介绍的都是将IMU板插在树莓派上 然后使用树莓派的IIC接口来数据通信 因此不需要额外接线就可以发布imu话题的 若使用串口进行通信的话 若
  • 在Linux下安装jdk的步骤

    1 下载安装包 http www oracle com technetwork java javase downloads jdk8 downloads 2133151 html 版本 jdk 8u191 linux x64 tar gz
  • 确实卷,公司新来的00后卷王,我们这帮老油条真干不过.....

    都说00后躺平了 但是有一说一 该卷的还是卷 这不 前段时间我们公司来了个00后 工作没两年 跳槽到我们公司起薪18K 都快接近我了 后来才知道人家是个卷王 从早干到晚就差搬张床到工位睡觉了 最近和他聊了一次天 原来这位小老弟家里条件不太好
  • C#反编译工具:ILSpy

    参考 反编译软件ILSpy的使用教程 TONY5388的博客 CSDN博客 ilspy exe 总结 以前以为dnspy是反编译的 结果发现iLSpy是真的好用 可以选择生成不同C 版本的源码
  • SQLite数据库总结

    参考网址 https www cnblogs com stephen liu74 archive 2012 02 29 2328348 html 3种工作模式 1 SQLite完全内存数据库 在SQLite中 数据库通常是存储在磁盘文件中的
  • 【python】KNN模型训练及应用01

    目的应用 让电脑代替人工对图片分类 1 数据加载 from sklearn datasets import load iris from sklearn model selection import train test split fro
  • 今天终于知道了如果用layero获取layer弹窗中的子元素了

    通过layer弹出的ifram 想要获取里面的元素并且绑定相应的事件 以前一直不知道layero是什么意思 可以通过下面的代码自己体会一下 layer open type 2 title 文件管理 shadeClose true shade
  • 基于XStream的JavaBean与XML相互转换

    相对于JAXB XStream更简洁一些 常用注解 XStreamAlias 定义xml节点名 1 引入XStream依赖
  • 数据清洗分析导出遇到的一些问题

    本文简单记录一个学习过程 无技术含量 勿喷 环境 ambari 2 6 1 spark 2 1 python 3 6 oracle 11 2 sqoop 1 4 最近一直在测试数据采集 清洗 分析 导出 展示的一系列的工作 主要数据流程如下
  • 服务器定时重启问题排查

    上周主要处理了 两个生产问题 工作电脑没带 主要简述一下 每天的20 13分linux服务器 centos7 4 重新启动 应用服务接口类交易 耗时20秒 频发 这里先说一下服务器重启的问题 此次重启共发生三天 第一次主要排查管控平台 发现
  • 压缩感知与磁共振成像

    01 压缩感知原理和建模 传统的数据采样和重构需要遵循Nyquist采样定律 即采样频率必须大于信号频率带宽的2倍 才能完整的重建信号 如果采样频率低于2倍的频率带宽 信号在频域频谱搬移后就会发生混叠 产生伪影 压缩感知 Compresse
  • 【千奇百怪】PHP代码质检工具PHPCS分析介绍与使用

    前两天 还是在对一个代码质量检测平台维护的时候 遇到了好几个关于PHP质检的需求 而老平台上支持的php在新平台还未实现 于是简单研究了一下php的质检工具 准备接入新平台 系列文章目录 java自定义spotbugs检测器 PHP代码质检