VSCode 扩展 Intelephense 给出了多态性和动态绑定错误 "Undefined method 'xxx'. Intelephense (1013)"

VSCode extension Intelephense gives error "Undefined method 'xxx'. Intelephense (1013)" with polymorphism and dynamic binding

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

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

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

$documentManager = new FatturaVenditaDocumentManager();
$documentSaver = new FatturaVenditaDocumentSaver($documentManager);
$documentSaver->baseFunction1();

考虑 FatturaVenditaDocumentSaver 中的以下代码:

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

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

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

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

预先感谢您的帮助。

已找到解决方案!

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

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

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