告诉 intelephense 该函数是有效的



考虑以下类结构:

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;
}

我能否以某种方式告诉我的智力(使用文档块或其他任何东西(,在那种特定情况下,definedFunction确实被定义?上面的代码有效,尽管 intelephense 抱怨它,我可以用文档块或其他东西禁用该投诉吗?

另一方面,有没有其他方法可以重组我的代码,以便智能感知了解此方法?基本上,我在这里用这个结构做错了什么吗?

我想要实现的是:class A是一个模板类,它由一堆其他类扩展。其中一些其他类应该能够使用一些常用方法,但不是全部。因为我无法在 PHP 中扩展多个类,所以我尝试用traits解决这个问题。如果我碰巧遇到这种类之一,我会用它实现一个interface(以某种方式将其分组以供以后访问(,并告诉它使用定义的trait,以获得所有添加的功能。我在上面的例子中test调用的函数是所有扩展class A类都必须能够访问的函数,但是当一个类implements MyInterface时,该函数应该获得一些附加功能。这就是为什么我没有把它放在我定义的trait中。

根据对最初问题的注释,我通过告诉Intelephense(PHP语言服务器($this绝对是一个在if语句范围内实现特征的类实例来解决这个问题。请注意,我还必须提供一个命名空间才能在本地正常工作:

<?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;
}

最新更新