VSCode插件Intelephense在使用多态和动态绑定时提示错误“Undefined method 'xxx'. Intelephense (1013)”。

3

我正在使用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中实现的代码,其中会正确执行FatturaVenditaDocumentManager中实现的fvdmSpecificFunction1()
问题在于Intelephense会给出错误提示“Undefined method 'fvdmSpecificFunction1'. Intelephense (1013)”,因为BaseDocumentManager中未定义fvdmSpecificFunction1
有没有办法让Intelephense理解我的代码的真正实现(考虑到Intelephense解析我所有的PHP代码)?我不想禁用Intelliphense的“undefined method”检查,也不想在BaseDocumentManager中添加空的fvdmSpecificFunction1,因为这与项目逻辑不一致。
非常感谢您的帮助。
1个回答

3

解决方案已找到!

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

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

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

这看起来不错。虽然我有一个类似但不同的问题。我需要为一个参数做这个。在某些函数中,接收到的参数(对象)上有一个动态添加的属性。有没有办法用文档注释解决这个问题?否则,我将不得不在类上定义属性(即使它是动态填充的[ORM 事物])。 - akinuri
@akinuri,如果参数的所有可能类都继承自同一个接口,你可以在文档块中的@param定义中指定该接口。 - Ma3x

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接