【问题标题】:VSCode extension Intelephense gives error "Undefined method 'xxx'. Intelephense (1013)" with polymorphism and dynamic binding具有多态性和动态绑定的 VSCode 扩展 Intelephense 给出错误“未定义的方法 'xxx'。Intelephense (1013)”
【发布时间】:2021-08-01 00:01:51
【问题描述】:

我正在使用 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 中的一个常见实现,使用多态性和动态绑定:使用从 FatturaVenditaDocumentManager 实例化的文档管理器创建了 FatturaVenditaDocumentSaver 的实例,调用 $documentSaver->baseFunction1() 将执行在 FatturaVenditaDocumentSaver 中实现的代码和,在里面,会正确执行fvdmSpecificFunction1()里面在FatturaVenditaDocumentManager中实现的代码。

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

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

提前感谢您的帮助。

【问题讨论】:

    标签: php visual-studio-code vscode-extensions intelephense


    【解决方案1】:

    找到解决方案!

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-19
      • 2021-09-15
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      相关资源
      最近更新 更多