Представьте себе следующую гипотетическую структуру классов, а не слишком необычный сценарий, когда все намеки PHPdoc настроены правильно:
class BaseFilter { /** ...base methods... */ } class TextFilter extends BaseFilter { public function setMinLength($len) { /** ...irrelevant */ } } class SomethingWithFilters { /** * @param BaseFilter $filter A valid filter to be added. * @return BaseFilter The filter that was added for easy chaining */ public function addFilter(BaseFilter $filter) { $this->filters[] = $filter; return $filter; } /** @var BaseFilter[] A list of filters */ private $filters = []; }
Теперь я использую этот код следующим образом:
$myClass = new SomethingWithFilters(); $myClass->addFilter(new TextFilter())->setMinLength(8);
В phpStorm (и, вероятно, большинство других IDE, поскольку это имеет смысл) вторая строка выдает предупреждение, в котором указано, что BaseFilter
не содержит метода setMinLength
. Хотя это абсолютно правильно, это предполагаемое поведение полиморфизма, полностью использующее поздние характеристики привязки PHP – на языке, подобном C #, который вам нужно было бы выполнить в ярости. Поэтому я ожидал бы, что синтаксис phpDoc будет поддерживать какую-то динамическую нотацию здесь, заявив, что возвращаемый тип для addFilter
идентичен типу $filter
.
Я попытался изменить его на:
@return $filter
Но это просто появляется в качестве ссылки на BaseFilter
и рассматривается как таковое, все еще давая предупреждение.
Есть ли какой-либо стандартизированный способ достижения этого эффекта, таким образом, что, по крайней мере, общие IDE могут его понять?
Вероятно, лучшее, что могла бы сделать IDE, было бы, если бы ваш @return на addFilter () фактически перечислял все возможные дети BaseFilter, которые могли быть возвращены:
@return BaseFilter|TextFilter|AnotherFilter
Это может привести к тому, что ваша среда IDE предоставит все возможные методы для всех возможных классов возврата. Это зависит от того, знает ли IDE, как распознать такой список возможных типов возврата. Очевидно, это будет утомительно с вашей стороны, хотя, поместив такой список во многие возвращаемые теги.
Я не знаю какой-либо среды IDE, которая бы посмотрела на ваш тип возврата только BaseFilter, сгенерировала список всех возможных родительских + дочерних методов и, таким образом, автоматически включила весь список для автозаполнения.