虽然这个问题一般是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正在使用一个没有子类的方法/属性的特定类名。
假设我们确实需要类型提示功能,(如果没有,请留下这个问题 - 我不想在这里使用无用的参数),我该如何解决这个问题?
我提出了以下可能性:
return $this;
的含义(这甚至可以工作吗?)答案 0 :(得分:4)
您可以这样解决:
class ParentClass {
/**
* Says 'hi' to the world.
* @return static
*/
public function say_hi(){
echo 'hi';
return $this;
}
}
“@return static”语句允许你想要的,PhpStorm可以正常使用它。
答案 1 :(得分:2)
您所描述的通常被称为“流畅的界面”,其中所有对象的方法都可以完成工作并返回对象本身。
我个人没有看到任何关于如何做到这一点的PHPDoc指南。因此,我不知道任何IDE都提供了自动完成功能来处理用例的方法。
PHPDoc可能采用的一种方法是利用“@return $ this”作为表示流畅方法的约定,因为它与代码语法本身相匹配,因此非常清楚。我怀疑任何IDE都会构建这种功能,直到标准本身包含这个用例。
在短期内,我认为您多余的“ChildClass :: say_hi(){parent :: say_hit();}”可能让您的IDE自动完成工作。同样,可能,因为拥有自动完成功能还可识别方法链接本身(例如$ foo-&gt; bar() - &gt; baz() - &gt; roll() - &gt; tide();)可能不存在。