VSCode中Intelephense无法识别嵌套require的$dbh类型(P1006)问题
问题描述
使用VSCode 1.90.2和PHP Intelephense v1.11.2开发网站,所有PHP页面都需要引入init.php初始化脚本,该脚本会加载包括数据库连接在内的其他依赖文件:
- 请求页面
login.php开头代码:
require 'include/init.php';
init.php中最终引入数据库连接脚本:
require 'include/db_connect.php';
db_connect.php内创建PDO实例的代码:
<?php try { $dbh = new PDO('mysql:host=' . $config['db_host'] . ';dbname=' . $config['db_db'] . ';charset=utf8mb4', $config['db_user'], $config['db_pass']); } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "<br/>"; die(); } $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
代码实际运行正常,但Intelephense在login.php中提示$dbh未定义:
Expected type 'object'. Found 'unset'.intelephense(P1006) @var unset $dbh
看起来Intelephense无法识别深层嵌套引入文件中定义的变量,尝试了以下三种解决方法:
- 将
db_connect.php的代码直接移到init.php中,错误消失但不符合项目结构需求; - 在
login.php的require语句后添加global $dbh;,错误消失但需要在每个页面脚本中重复添加,且疑惑为何需要global——代码实际运行时$dbh处于全局作用域,不加global也能正常使用; - 在
init.php中复制或克隆$dbh实例,错误消失但$dbh的类型从\PDO变为mixed,导致代码补全功能失效。
疑问
这是Intelephense的特性,还是可以通过设置调整?或是我遗漏了PHP的相关知识?有没有办法仅通过一次require就解决该问题,且不触发Intelephense的错误提示?
补充说明
后续发现该问题由Intelephense预发布版本导致:离线电脑上从谷歌搜索结果的市场链接下载的扩展版本为1.11.5,且未标注为预发布版;联网电脑上通过VSCode安装的正式版1.10.4不存在该错误提示,但仍无法识别$dbh的PDO类型,导致代码补全功能无法使用,目前只能暂时接受该情况。
内容的提问来源于stack exchange,提问作者Manuel H.
相关产品推荐
相关产品推荐

