如何让Psalm识别include引入文件中的变量,优先使用数组形状语法
解决方案
该需求完全可以实现,优先使用数组形状标注的方案操作如下:
方案1:在配置文件中定义变量类型(推荐)
直接在config.php中给$config变量加上数组形状的类型标注,Psalm 扫描到配置文件后会全局记录该变量的类型,所有引入该配置的位置都能自动识别:
<?php // config.php 中的代码示例 /** * 可根据实际配置项调整数组形状的字段和类型 * @var array{host:string, port?:int, user:string, pass:string, dbname:string} $config */ $config = [ 'host' => '127.0.0.1', 'user' => 'root', 'pass' => 'your_password', 'dbname' => 'your_database' ];
方案2:在引入配置的位置临时标注
如果不方便修改配置文件,也可以在include语句之后给$config变量补类型标注,仅对当前作用域生效:
function getConnection() { include 'config.php'; /** @var array{host:string} $config */ return new Connection($config['host']); }
可选优化:复用类型定义
如果$config会在多处使用,可以先定义类型别名减少重复代码:
// 可放在公共的类型定义文件头部 /** @psalm-type DbConfig = array{host:string, port?:int, user:string, pass:string, dbname:string} */
后续所有用到$config的位置都可以直接引用别名:
/** @var DbConfig $config */
如果你的配置文件路径是动态生成的,还可以在include前加/** @psalm-include 'config.php' */标注,主动告诉 Psalm 要引入的文件,避免扫描遗漏。
只要没有将config.php加入 Psalm 的排除扫描列表,以上配置完成后 Psalm 就可以正常识别$config变量的结构,不会再抛出未定义变量或者数组键不存在的错误。
内容的提问来源于stack exchange,提问作者Olle Härstedt
相关产品推荐
相关产品推荐

