Рассмотрим следующие структуры классов:
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
, который я определяю.