psalm 默认不报未使用变量,因unusedvariable仅在errorlevel≤5启用,且需显式配置true和true。

Psalm 在 PHP 8.2 + Psalm 6 下默认就能检测未使用的变量和代码,但是否真能报出来,取决于配置级别和上下文——不是装完就自动全量识别。
为什么有些未使用变量没被 Psalm 报告?
因为 Psalm 的 errorLevel 控制严格程度,低级别(如 level="8")会跳过大量“风格类”问题,包括:
-
UnusedVariable(未使用变量)默认只在level ≤ 5启用 -
UnusedClass、UnusedMethod、UnusedParam同样受 level 限制 - 闭包内、
foreach解构赋值、list()中的变量可能被误判为“已使用”,实际未读取 - PHPDoc 注解中声明但未实际使用的参数(如
@param类型提示)不触发警告,除非启用reportMixedIssues或checkForTypeErrors
psalm.xml 中必须确认的几项配置
打开你的 psalm.xml,检查以下关键节点是否显式设置(不要依赖默认值):
-
<psalm errorlevel="4"></psalm>—— 建议设为4或5,6+会静默掉大部分未使用检测 -
<unusedcode><reportunusedvariables>true</reportunusedvariables></unusedcode>—— Psalm 6 引入的独立开关,必须显式开启 -
<findunusedcode>true</findunusedcode>—— 启用整体未使用代码扫描(类、方法、属性等) -
<usedocblocktypes>true</usedocblocktypes>—— 确保@var、@param被用于类型推断,否则变量用途判断不准
示例最小有效片段:
<psalm errorlevel="4"><findunusedcode>true</findunusedcode><unusedcode><reportunusedvariables>true</reportunusedvariables></unusedcode><usedocblocktypes>true</usedocblocktypes></psalm>
哪些场景下 Psalm 会漏报未使用变量?
常见漏报点,不是 bug,是设计权衡:
-
foreach ($items as $item) { /* 没用 $item */ }——$item被视为“可能用于副作用”,默认不报;加@psalm-suppress UnusedVariable才能强制忽略,但反向说明它本该报 - 函数参数带默认值且未在函数体内引用:
function foo($x = 'default') { return 1; }—— Psalm 6 默认不报,需配合UnusedParamrule 显式启用 - 动态属性访问:
$obj->{ $key } = $val;中的$key可能被判定为“已使用”,即使后续没读取 - 短路逻辑中的左操作数:
$a = expensive(); $b || $a;——$a被视为“可能被短路跳过”,Psalm 不保证标记为未使用
验证是否真生效:手动触发一次精准扫描
别只跑 vendor/bin/psalm,它可能缓存旧结果。用以下命令强制重检未使用代码:
-
vendor/bin/psalm --find-dead-code—— 专用模式,专扫未使用类/方法/属性(不包含变量) -
vendor/bin/psalm --no-cache --show-info=false src/MyClass.php—— 清缓存+关 info 提示,聚焦 warning/error - 加
--debug-emitted-issues查看 Psalm 实际 emit 了哪些 issue code,确认UnusedVariable是否在其中
如果仍不报,检查是否被 <issuehandlers></issuehandlers> 静默了,或项目根目录存在 .psalm/config.php 覆盖了 XML 配置。
最易被忽略的是 <unusedcode></unusedcode> 块和 errorLevel 的联动 —— 它们不写明,Psalm 就按保守策略跳过。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











