考虑以下类结构:
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;
}