VSCode 扩展 Intelephense 给出错误“未定义的方法 'xxx'Intelephense1013”具有多态性和动态绑定

问题描述

我正在使用 VScode (v1.56) 开发 PHP (v7.0.33) 项目。我最近安装了 VSCode 的扩展 Intelephense (v1.7.1) 并开始按照 Intelephense 的建议清理我的代码

我的项目中的一组类具有以下结构(函数名称不是真实的,但只是为了让您看到对于每个子类我都有一些从超类覆盖的函数(那些带有前缀 baseFunction)以及特定于该子类的新函数(类首字母缩写为 fdmSpecificFunction函数):

enter image description here

根据图表,每个 DocumentSaver 都有一个 DocumentManager 的实例。 例如,我创建 FatturavenditaDocumentSaver 实例的代码

$documentManager = new FatturavenditaDocumentManager();
$documentSaver = new FatturavenditaDocumentSaver($documentManager);
$documentSaver->baseFunction1();

考虑 FatturavenditaDocumentSaver 中的以下代码

public function baseFunction1() {
    parent::baseFunction1();
    $this->documentManager->fvdmSpecificFunction1();
}

这是 OOP 中的常见实现,使用多态和动态绑定:使用从 FatturavenditaDocumentSaver 实例化的文档管理器创建了 FatturavenditaDocumentManager 的实例,调用 $documentSaver->baseFunction1() 将执行代码FatturavenditaDocumentSaver 中实现,并在其中正确执行 fvdmSpecificFunction1() 中实现的 FatturavenditaDocumentManager 中的代码

问题是 Intelephense,因为 fvdmSpecificFunction 中未定义 BaseDocumentManager,给了我错误“未定义的方法 'fvdmSpecificFunction1'。Intelephense (1013)”。

有没有办法让 Intelephense 理解我的代码的真实实现(考虑到 Intelephense 解析我所有的 PHP 代码)?我想避免禁用 Intelliphense 的“未定义方法”检查,并且我不喜欢在 fvdmSpecificFunction1添加一个空的 BaseDocumentManager,因为这与项目的逻辑不一致。

预先感谢您的帮助。

解决方法

找到解决方案!

我只需在 @property 块之前添加 class 提示,指定对象 $documentManager 的类型。

/**
 * @property    FatturaVenditaDocumentManager   $documentManager
 */
class FatturaVenditaSaver extends FatturaSaver {
    public function baseFunction1() {
        parent::baseFunction1();
        $this->documentManager->fvdmSpecificFunction1();
    }
}

通过这种方式,Intelephense 了解与该对象相关的真实类。