php质量工具系列之paslm

Psalm是一个静态分析工具,深入程序,尽可能多地找到与类型相关的bug

混合类型警告

Intelligent logic checks

属性初始化检查

Taint analysis

Language Server

Automatic fixes

Automatic refactoring

安装

shell 复制代码
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

初始化

shell 复制代码
./vendor/bin/psalm --init

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

执行

shell 复制代码
./vendor/bin/psalm

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

参数解释:

--show-info 显示非异常的分析结果

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

参数解释:

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

插件

查看可用插件列表

shell 复制代码
composer search -t psalm-plugin '.'

安装

shell 复制代码
composer global require --dev <plugin-vendor/plugin-package>

启用

shell 复制代码
vendor/bin/psalm-plugin enable plugin-vendor/plugin-package

禁用

shell 复制代码
vendor/bin/psalm-plugin disable plugin-vendor/plugin-package

显示已安装列表

shell 复制代码
vendor/bin/psalm-plugin show

配置

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

yaml 复制代码
<?xml version="1.0"?>
<psalm
    errorLevel="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章节

相关推荐
YJlio9 小时前
网络与通信具总览(14.0):从 PsPing 到 TCPView / Whois 的联合作战
开发语言·网络·php
yong99909 小时前
超宽带系统链路 MATLAB 仿真
开发语言·算法·matlab
2501_915106329 小时前
Windows 环境下有哪些可用的 iOS 上架工具, iOS 上架工具的使用方式
android·ios·小程序·https·uni-app·iphone·webview
yaoxin5211239 小时前
278. Java Stream API - 限制与跳过操作全解析
java·开发语言·python
iCheney!9 小时前
php生成赛博像素风头像
开发语言·php
短剑重铸之日9 小时前
《深入解析JVM》第五章:JDK 8之后版本的优化与JDK 25前瞻
java·开发语言·jvm·后端
love530love9 小时前
【探讨】“父级/基环境损坏,子环境全部失效”,如何避免 .venv 受父级 Python 损坏影响?
java·开发语言·人工智能·windows·python·编程·ai编程
shbelec9 小时前
实邦电子在电子产品开发方面有哪些优势与特色?
开发语言
阿里嘎多学长10 小时前
2025-12-31 GitHub 热点项目精选
开发语言·程序员·github·代码托管
无限进步_10 小时前
【C语言】循环队列的两种实现:数组与链表的对比分析
c语言·开发语言·数据结构·c++·leetcode·链表·visual studio