Сообщите 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;
}
Могу ли я как-нибудь сказать своему intellisense (с блоками документов или чем-то еще), что в этой конкретной ситуации definedFunction
действительно определяется? Приведенный выше код работает, несмотря на то, что intelephense жалуется на это, могу ли я отключить эту жалобу с помощью докблока или чего-то еще?
С другой стороны, есть ли другой способ реструктурировать мой код, чтобы intellisense узнал об этом методе? В принципе, я что-то не так делаю с этой структурой?
Я хочу добиться следующего: class A
- это шаблонный класс, который расширяется множеством других классов. Некоторые из этих других классов должны иметь возможность использовать некоторые общие методы, но не все из них. Поскольку я не могу расширить несколько классов в PHP, я попытался решить эту проблему с помощьюtraits
. Если я встречу один из таких классов, я используюinterface
с ним (чтобы как-то сгруппировать его для дальнейшей доступности) и сказать ему использовать определенный trait
, чтобы получить все дополнительные функции. Функция, которую я называюtest
в приведенном выше примере это функция, которая ВСЕ классы, расширяющие class A
должен иметь доступ, но когда класс implements MyInterface
, эта функция должна получить некоторые дополнительные функции. Вот почему я не поместил это вtrait
Я определяю.
1 ответ
Основываясь на комментариях к исходному вопросу, я решил эту проблему, сообщив 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;
}