Исправьте 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
, Тем не менее он автоматически завершает методы и свойства, которые принадлежат исключительно дочернему классу.