类型提示抽象类单例

时间:2017-04-03 15:01:22

标签: php oop phpstorm

如何在一个抽象类上使用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是错误的,因为该方法永远不会返回抽象类的对象实例。

2 个答案:

答案 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才能工作。