Исправьте phpDoc, чтобы сообщить IDE тип возвращаемого динамического класса

Рассмотрим этот код:

class ParentClass {

    /** @return ParentClass  */
    public function getNew(){
        return call_user_func(array($this,'generator'));
    }

    protected function generator(){
        return new static(); // will actually return whatever class calls this code
    }
}

class ChildClass extends ParentClass {}

$child = new ChildClass();
var_dump($child->getnew()); // object(ChildClass)

Так как ParentClass::generator() возвращает static()когда дочерний экземпляр вызывает getNew(), ChildClass() возвращается IDE (PhpStorm в моем случае) не может решить эту проблему, поскольку генератор динамически вызывается с call_user_func(), В результате IDE считает, что ParentClass Экземпляр будет возвращен:

Есть ли способ улучшить родительский блок phpDoc для лучшего отражения возвращаемого типа?

1 ответ

Я понял это, используя этот блок phpDoc для ParentClass::getNew():

/** @return static */
public function getNew(){/*...*/}

phpDoc Типы ключевых слов

self - Объект класса, где этот тип использовался, если он унаследован, он все равно будет представлять класс, в котором он был первоначально определен.

static - объект класса, где это значение было использовано, если оно унаследовано, оно будет представлять дочерний класс. (см. позднее статическое связывание в руководстве по PHP).

$ this - этот точный экземпляр объекта, обычно используемый для обозначения свободного интерфейса.

PhpStorm 2017.2 понимает это и признает, что $child->getNew() вернет дочерний экземпляр. IDE не совсем это называет ChildClass, скорее static, Тем не менее он автоматически завершает методы и свойства, которые принадлежат исключительно дочернему классу.

Другие вопросы по тегам