考虑以下类结构:
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
中。
1条答案
按热度按时间s3fp2yjn1#
基于对第一个问题的评论,我已经通过告诉Intelephense(一个PHP语言服务器)$this绝对是一个在if语句范围内实现trait的类示例来解决这个问题。请注意,我还必须提供一个名称空间,以便在本地正常工作: