虽然这个问题通常是关于DocBlocks的,但我的用例是关于PHP的。
考虑以下PHP代码:
<?php
class ParentClass {
/**
* Says 'hi' to the world.
* @return ParentClass Returns itself for chaining.
*/
public function say_hi(){
echo 'hi';
return $this;
}
}
class ChildClass extends ParentClass {
/**
* Says 'bye' to the world.
* @return ChildClass Returns itself for chaining.
*/
public function say_bye(){
echo 'bye';
return $this;
}
}
$c = new ChildClass;
$c->say_hi()->say_b| <- type hinting won't suggest "say_bye" here
?>
这只是一个带有一些链接的琐碎类。扩展类失去了类型提示,因为父类的docblock正在使用一个没有子类的方法/属性的特定类名。
假设我们确实想要类型提示功能(如果不是,请留下这个问题——我不想要无用的参数),我应该如何解决这个问题?
我提出了以下可能性:
- 更改PHPDoc标准以允许使用特殊关键字
- 添加一个多余的say_hi()方法,该方法调用父对象只是为了重新声明docblock
- 根本不指定返回类型,让IDE决定
return $this;
的含义(这行得通吗?)
你可以这样解决这个问题:
class ParentClass {
/**
* Says 'hi' to the world.
* @return static
*/
public function say_hi(){
echo 'hi';
return $this;
}
}
"@return static"语句完全可以满足您的需求,PhpStorm可以很好地使用它。
您所描述的通常被称为"fluent接口",对象的所有方法都在其中完成工作并返回对象本身。
我个人还没有看到PHPDoc关于如何做到这一点的指导方针最终确定。因此,我不知道任何IDE已经为其自动完成功能提出了处理用例的方法。
PHPDoc对此可能采取的一种方法是利用"@return$this"作为表示流利方法的约定,因为它与代码语法本身相匹配,因此非常清晰。我怀疑在标准本身包含这个用例之前,任何IDE都不会构建这种能力。
在短期内,我认为您多余的"ChildClass::say_hi(){parent::say_hit();}"可能会让IDE自动完成工作。同样,可能,因为自动完成也可以识别方法链接本身(例如$foo->bar()->baz()->roll()->tid();)可能不存在。