一个Type Hint如何在抽象类上返回一个静态单例返回方法,该方法返回被扩展类的实例?
例如,让我们看下面的代码:
<?php
abstract class Foo {
/** @return Foo */
public function init() {
static $instance;
if ( is_null($instance) ) {
$class = get_called_class();
$instance = new $class();
}
return $instance;
}
}
class Bar extends Foo {
public $name = "Bar name";
}
class Baz extends Foo {
public $age = 42;
}
我的目的是让PhpStorm之类的工具理解Bar :: init()返回Bar类型的对象,而Baz :: init()返回Baz类型的对象.因此,例如,从Baz :: init()方法创建的对象将自动完成name属性,而不自动完成age属性.
显然,当前类型提示@return Foo是错误的,因为该方法永远不会返回抽象类的对象实例.
解决方法:
因此@return static在这种情况下将适用于PHPStorm.这是最简单的选项,它将提供您想要的东西.
您可以选择对类使用@method注释,尽管这是非常手动的操作,需要针对每个类进行. PHPStorm中此方法还有另外一件奇怪的事情,如果您导航到init()方法(按ctrl单击或w / e),它将首先导航到该注释.但是,这是这样的:
/**
* @method Bar init()
*/
class Baz extends Foo
{
}
可以选择作为最终解决方案的地方-我真的不认为您会需要它,但是为了完整性起见.像常规方法一样扩展方法并添加返回注释.
/**
* @return Baz
*/
public function init()
{
return parent::init();
}