如何在一个抽象类上使用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
是错误的,因为该方法永远不会返回抽象类的对象实例。
答案 0 :(得分:3)
因此@return static
适用于PHPStorm。 这是最简单的选项,它将提供您正在寻找的内容。
您可以选择对课程使用@method
注释,尽管这是非常手动的,需要为每个课程完成。 PHPStorm中有另一种奇怪的方法,如果你导航到init()
方法(ctrl + click或w / e),它将首先导航到这个注释。不过这是看起来的样子:
/**
* @method Bar init()
*/
class Baz extends Foo
{
}
可选作为最后的手段 - 我真的不认为你需要它,但它的完整性。像普通方法一样,扩展方法并添加返回注释。
/**
* @return Baz
*/
public function init()
{
return parent::init();
}
答案 1 :(得分:1)
你可以试试这个:
abstract class Foo {
/** @return static */
public function init() {
static $instance;
if ( is_null($instance) ) {
$class = get_called_class();
$instance = new $class();
}
return $instance;
}
}
这可能需要使用PHP 5.3+类型提示来设置PhpStorm才能工作。