Скажите intelephense, что функция действительна - PullRequest
0 голосов
/ 13 февраля 2020

Рассмотрим следующие структуры классов:

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 (с блоками do c или чем-то еще), что в этой конкретной c ситуации definedFunction действительно определены? Приведенный выше код работает, несмотря на то, что intelephense жалуется на него. Могу ли я отключить эту жалобу с помощью docblock или чего-то еще?

С другой стороны, есть ли другой способ реструктурировать мой код, чтобы intellisense знал об этом методе? По сути, я что-то не так делаю с этой структурой?

Я хочу добиться следующего: class A - это шаблонный класс, который расширяется кучей других классов. Некоторые из этих других классов должны иметь возможность использовать некоторые распространенные методы, но не все из них. Поскольку я не могу расширить несколько классов в PHP, я попытался разрешить это с помощью traits. Если я сталкиваюсь с одним из таких классов, я реализую с ним interface (чтобы как-то сгруппировать его для более позднего доступа) и приказываю ему использовать определенный trait, чтобы получить все дополнительные функции. Функция, которую я называю test в приведенном выше примере, является функцией, к которой ВСЕ классы, которые расширяют class A, должны иметь доступ, но когда класс implements MyInterface, эта функция должна получить некоторые дополнительные функциональные возможности. Вот почему я не включил это в trait, который я определяю.

...