问题描述
我正在使用 VScode (v1.56) 开发 PHP (v7.0.33) 项目。我最近安装了 VSCode 的扩展 Intelephense (v1.7.1) 并开始按照 Intelephense 的建议清理我的代码。
我的项目中的一组类具有以下结构(函数名称不是真实的,但只是为了让您看到对于每个子类我都有一些从超类覆盖的函数(那些带有前缀 baseFunction
)以及特定于该子类的新函数(类首字母缩写为 fdmSpecificFunction
的函数):
根据图表,每个 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 了解与该对象相关的真实类。