次の架空のクラス構造を想像してみてください。これは、すべての 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) では、2 行目BaseFilter
で method が含まれていないことを示す警告が生成されますsetMinLength
。完全に正しいですが、これは PHP のレイト バインディングの特性を十分に活用したポリモーフィズムの動作を意図したものです。C# のような言語では、明示的にアップキャストする必要があります。そのため、phpDoc 構文は、ここで何らかの動的表記をサポートし、戻り値の型が提供さaddFilter
れた型と同じであることを示していると思い$filter
ます。
私はそれを次のように変更しようとしました:
@return $filter
しかし、これは参照として表示され、BaseFilter
そのように扱われ、警告が表示されます。
少なくとも一般的なIDEが理解できるように、この効果を達成する標準化された方法はありますか?