PHP-类型提示抽象类单例

一个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();
}
上一篇:PhpStorm最新注册使用方法


下一篇:phpstorm设置背景图片