php质量工具系列之paslm

Psalm是一个静态分析工具,深入程序,尽可能多地找到与类型相关的bug
混合类型警告
Intelligent logic checks
属性初始化检查
Taint analysis
Language Server
Automatic fixes
Automatic refactoring

安装

composer global require --dev vimeo/psalm 
# 当使用这个方式安装时,如果psalm的依赖和项目依赖有冲突,可使用phar安装
composer global require --dev psalm/phar

注意:
linux上,需要将全局composer的可执行目录加入环境变量,目录路径一般是/tmp/composer/vendor/bin
环境变量配置

windows上,只需在环境变量path中加上composer路径,目录路径一般是
%APPDATA%\Composer\vendor\bin

初始化

./vendor/bin/psalm --init

psalm扫描你的项目,评估适合项目的错误级别,并生成psalm.xml文件用于后续的扫描配置

执行

./vendor/bin/psalm#或者扫描某个或某些文件
./vendor/bin/psalm file1.php [file2.php...]
./vendor/bin/psalm --show-info=true

参数解释:
–show-info 显示非异常的分析结果

#针对特定问题给出psalm的解决方案,可参考其结果进行代码修复
./vendor/bin/psalm --alter --issues=MissingReturnType --dry-run

参数解释:
–issues all 显示全部问题解决方案;其他问题type,多个间以逗号分隔,如 MissingReturnType,InvalidArgument

插件

查看可用插件列表

composer search -t psalm-plugin '.'

安装

composer global require --dev <plugin-vendor/plugin-package>

启用

vendor/bin/psalm-plugin enable plugin-vendor/plugin-package

禁用

vendor/bin/psalm-plugin disable plugin-vendor/plugin-package

显示已安装列表

vendor/bin/psalm-plugin show

配置

以下是我的配置,大家可以根据情况选择配置

<?xml version="1.0"?>
<psalmerrorLevel="4"resolveFromConfigFile="true"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="https://getpsalm.org/schema/config"xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"findUnusedBaselineEntry="true"findUnusedCode="true"autoloader="psalm_autoloader.php"allowStringToStandInForClass="true"
><!-- 添加错误忽略配置 --><issueHandlers><DocblockTypeContradiction><errorLevel type="suppress"><directory name="app"/><!--<file name="path/to/file_with_unused_methods.php"/>--></errorLevel></DocblockTypeContradiction><NonInvariantDocblockPropertyType><errorLevel type="suppress"><directory name="app"/></errorLevel></NonInvariantDocblockPropertyType><PossiblyUndefinedArrayOffset><errorLevel type="suppress"><directory name="app"/></errorLevel></PossiblyUndefinedArrayOffset><PossiblyInvalidOperand><errorLevel type="suppress"><directory name="app"/></errorLevel></PossiblyInvalidOperand><PossiblyUndefinedVariable><errorLevel type="suppress"><directory name="app"/></errorLevel></PossiblyUndefinedVariable><RiskyTruthyFalsyComparison><errorLevel type="suppress"><directory name="app"/></errorLevel></RiskyTruthyFalsyComparison><PossiblyInvalidMethodCall><errorLevel type="suppress"><directory name="app/model"/></errorLevel></PossiblyInvalidMethodCall><MissingReturnType><errorLevel type="suppress"><directory name="app/model"/></errorLevel></MissingReturnType><PossiblyNullOperand><errorLevel type="suppress"><directory name="app/model"/></errorLevel></PossiblyNullOperand><PossiblyNullArgument><errorLevel type="suppress"><directory name="app/model"/></errorLevel></PossiblyNullArgument><PropertyNotSetInConstructor><errorLevel type="suppress"><directory name="app"/></errorLevel></PropertyNotSetInConstructor><UnusedClass><errorLevel type="suppress"><directory name="app"/></errorLevel></UnusedClass><PossiblyUnusedMethod><errorLevel type="suppress"><directory name="app"/></errorLevel></PossiblyUnusedMethod><UndefinedConstant><errorLevel type="suppress"><directory name="app"/><directory name="config"/></errorLevel></UndefinedConstant><UnusedConstructor><errorLevel type="suppress"><file name="app/redis"/></errorLevel></UnusedConstructor><UnusedMethod><errorLevel type="suppress"><file name="app/common"/></errorLevel></UnusedMethod><UnusedFunctionCall><errorLevel type="suppress"><file name="app/common.php"/></errorLevel></UnusedFunctionCall><PossiblyUnusedProperty><errorLevel type="suppress"><file name="app/BaseController.php"/></errorLevel></PossiblyUnusedProperty><InvalidArrayOffset><errorLevel type="suppress"><file name="app/common.php"/></errorLevel></InvalidArrayOffset><InvalidArgument><errorLevel type="suppress"><file name="config/database.php"/></errorLevel></InvalidArgument></issueHandlers><!-- 配置需要扫描的范围,以及需要忽略的目录和文件 --><projectFiles><directory name="app" /><directory name="config" /><ignoreFiles><directory name="vendor" /><directory name="test" /><file name="app/command/Swagger.php" /></ignoreFiles></projectFiles>
</psalm>

文档解释:
issueHandlers 中是扫描问题的类型,其中directory 是需要忽略问题的目录,file是需要忽略问题的文件

自动化构建(Jenkins)中使用

参考文章 jenkins插件之Warnings 项目配置一章中的psalm章节

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/16736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

看潮成长日程表用户手册(上)

看潮成长日程表用户手册&#xff08;上&#xff09; 一、特色功能1、以每周日程表为主要形式2、全时管控的时间管理3、持续的日程管理4、分期间时间表5、按日排程&#xff0c;按周输出6、夏季作息时间处理7、年度假日处理8、休息日处理9、弹性日程10、完成记录11、多种输出形式…

重构与优化-前言

关注公众号畅读:IT技术馆 Java代码重构是优化现有代码结构、提升代码可读性、可维护性和性能的过程,而不会改变其外在行为。这包括命名规范、消除重复代码、改进设计模式的使用、优化数据结构和算法等。下面是一些常见的Java代码重构技巧及示例: 1. 重命名(Rename) 目的…

光纤跳线组成结构划分你知道吗

按照组成结构划分 光纤跳线根据组成结构的不同可分为带状光纤跳线和束状光纤跳线。带状光纤跳线使用的是由光纤带组成的带状光缆&#xff0c;大多呈扁平形状&#xff0c;因具有较高的光纤密度&#xff0c;它可以容纳更多的纤芯&#xff0c;因此大大节省布线成本和空间&#xf…

猫咪掉毛严重怎么办?小米、希喂、霍尼韦尔宠物空气净化器测评

吸猫成瘾&#xff0c;养猫“致贫”&#xff1f;在当今社会&#xff0c;养猫已成为众多年轻人的一个追捧的事情。乖巧又可爱&#xff0c;下班回到家撸一把猫已经成为年轻人的日常。但是猫咪可爱也不影响它的各种养猫伴生的问题&#xff01;无论是漂浮的浮毛、飘散的皮屑还是偶发…

C++11 新特性

原文 https://www.cnblogs.com/linuxAndMcu/p/11600553.html 1. nullptr (1) 作用&#xff1a;nullptr 的类型为 nullptr_t&#xff0c;能够隐式地转换为任何指针的类型&#xff0c;能和他们进行相等或者不等的比较。 简单说&#xff0c;nullptr目的是为了区分 空指针NULL …

2024年上半年系统架构设计师真题-复原程度90%

前言 此次考试监考特别严格&#xff0c;草稿纸不允许带出考场&#xff0c;并且准考证上不允许任何写画&#xff0c;甚至连笔都允许带一支&#xff0c;所以下面的相关题目都是参考一些群友的提供&#xff0c;加上自己的记忆回顾&#xff0c;得到的结果。 其中综合知识部分的题…

1.int 与 Integer 的简单区别

蓝桥杯刷题从此开始&#xff1a; 第一题就是两个数的和&#xff0c;个人看来主要考察 int与integer 的区别&#xff1b; 这是我提交的答案&#xff0c;竟然会报错&#xff1a; import java.util.*; //输入A、B&#xff0c;输出AB。 class add {public static void main(String …

yolov10 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署,部署工程难度小、模型推理速度快

特别说明&#xff1a;参考官方开源的yolov10代码、瑞芯微官方文档、地平线的官方文档&#xff0c;如有侵权告知删&#xff0c;谢谢。 模型和完整仿真测试代码&#xff0c;放在github上参考链接 模型和代码。 yolov8、v9还没玩热乎&#xff0c;这不yolov10又来了&#xff0c;那么…

tomcat--安全配置多虚拟机

端口8005/tcp 安全配置管理 8005是Tomcat的管理端口&#xff0c;默认监听在127.0.0.1上。无需验证就可发送SHUTDOWN (大小写敏感)这个字符串&#xff0c;tomcat接收到后就会关闭此Server。此管理功能建议禁用&#xff0c;可将SHUTDOWN改为一串猜不出的字符串实现或者port修改成…

Python开发——os与os.path的使用

1. os的一般用法 使用dir()列出库的属性与方法 # 使用dir()列出库的属性与方法 print(dir(os)) 使用os.getcwd()打印当前目录 # 使用os.getcwd()打印当前目录 print("当前目录为:"os.getcwd()) # 打印表示当前工作目录的字符串 获取指定路径下的目录和文件列表 #…

Java进阶学习笔记26——包装类

包装类&#xff1a; 包装类就是把基本类型的数据包装成对象。 看下API文档&#xff1a; deprecated&#xff1a;极力反对、不赞成的意思。 marked for removal&#xff1a;标识为去除的意思。 自动装箱&#xff1a;基本数据类型可以自动转换成包装类。 自动拆箱&#xff1a;…

前端怎么使用svg格式的图片

目录 第一步&#xff0c;找到图标 第二步&#xff0c;使用 第一种&#xff0c;SVG下载 第二种&#xff0c;粘贴SVG代码 第一步&#xff0c;找到图标 以阿里巴巴矢量图标库为例&#xff0c;随便找一个图标&#xff0c;如下图 第二步&#xff0c;使用 第一种&#xff0c;SV…

二维OTSU(二维大津法)matlab实现(复制粘贴即可)

二维OTSU&#xff08;二维大津法&#xff09;&#xff0c;matlab实现&#xff0c;&#xff08;复制粘贴即可&#xff09;&#xff0c;二维熵 我发现CSDN搜索故意屏蔽调免费、公开的代码&#xff0c;特别推荐的 都是收费&#xff0c;收币的代码或项目。我分享的都是开源的&…

AI开发工程师的学习路线

学习人工智能&#xff08;AI&#xff09;是一个广泛且深入的过程&#xff0c;涵盖了多个领域的知识和技能。以下是对AI学习路线的总结&#xff0c;旨在提供一个清晰的学习方向和步骤概览。 一、基础知识 数学基础&#xff1a;AI的核心是算法和数学模型&#xff0c;因此数学基础…

如何查看Linux kernel用哪个版本的gcc编译的?

查看内核是使用哪个版本的 GCC 编译的&#xff0c;可以使用 modinfo 命令来查看内核模块信息&#xff0c;其中包括使用的编译器版本。但请注意&#xff0c;并不是所有的内核模块都包含了这些信息。如果内核模块提供了&#xff0c;则你可以通过以下方式查看&#xff1a; modinf…

利用AI办公工具类API,大幅提高办公效率

AI办公工具类API是一项革命性的技术&#xff0c;利用人工智能的力量为办公场景提供了许多创新的解决方案。借助AI办公工具类API&#xff0c;用户可以实现自动化的文档处理、语音转文字、图像识别、数据分析等多种功能&#xff0c;大大提高了办公效率和工作质量。此外&#xff0…

突发!某大厂机房掉电,MySQL数据库无法启动,紧急恢复过程...

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…

正则表达式的匹配

正则表达式的语法总结 正则表达式的语法因不同的编程语言或工具而略有差异,但基本的结构和概念是相似的。下面是一个正则表达式的基本语法概述: 字符类 .:匹配除了换行符之外的任何单个字符。 [abc]:匹配方括号中的任何一个字符。例如,[aeiou] 匹配任何元音字母。 [^ab…

【算法】梦破碎之地---三数之和

相信大家都有做过两数之和&#xff0c; 题目链接&#xff1a; 15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 在文章的开始让我们回顾一下三数之和吧&#xff01; 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], …

Hololens2关闭软件自动校对人眼

原 因 &#xff1a;软件进入后总是提示需要校对人眼&#xff0c;对演示有很大的不方便&#xff0c;需要使用人进行处理。 处理效果&#xff1a;更换使用人员&#xff0c;不进行校对人眼。