php 告诉intelephense函数是有效的

shyt4zoc  于 2023-05-27  发布在  PHP
关注(0)|答案(1)|浏览(195)

考虑以下类结构:

trait MyTrait {
    public function definedFunction() {

    }
}

interface MyInterface {

}

class A {
     public function test() {
         if ($this instanceof MyInterface) {
              // my intelisense tells me that the definedFunction() is not defined
              $this->definedFunction();
         }
     }
}

class B extends A implements MyInterface {
     use MyTrait;
}

我能以某种方式告诉我的智能感知(使用doc块或其他东西),在特定情况下,definedFunction确实被定义了吗?上面的代码可以工作,尽管intelephense抱怨它,我可以用docblock或其他东西禁用这个抱怨吗?
另一方面,是否有其他方法可以重构我的代码,让intellisense知道这个方法?基本上,我在这个结构上做错了什么吗?
我想实现的是以下几点:class A是一个模板类,它由一堆其他类扩展。这些其他类中的一些应该能够使用一些通用方法,但不是所有方法。因为我不能在PHP中扩展多个类,所以我尝试用traits解决这个问题。如果我碰巧遇到一个这样的类,我用它实现一个interface(以某种方式将其分组,以便以后访问),并告诉它使用定义的trait,以获得所有添加的功能。在上面的例子中,我调用test的函数是一个所有扩展class A的类都必须能够访问的函数,但是当类implements MyInterface时,该函数应该获得一些附加功能。这就是为什么我没有把它放到我定义的trait中。

s3fp2yjn

s3fp2yjn1#

基于对第一个问题的评论,我已经通过告诉Intelephense(一个PHP语言服务器)$this绝对是一个在if语句范围内实现trait的类示例来解决这个问题。请注意,我还必须提供一个名称空间,以便在本地正常工作:

<?php

namespace Test;

trait MyTrait {
    public function definedFunction() {}
}

interface MyInterface {}

class A {
    public function test() {
        if ($this instanceof MyInterface) {
            /** @var MyTrait $this */
            $this->definedFunction();
        }
    }
}

class B extends A implements MyInterface {
    use MyTrait;
}

相关问题