Сообщите 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;
}
Другие вопросы по тегам