php - 类型提示抽象类单例

标签 php oop phpstorm

一个类型如何提示抽象类上的静态单例返回方法,该方法返回扩展调用类的实例?

例如,让我们看下面的代码:

<?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+click 或 w/e),它将首先导航到此注释。然而,这就是它的样子:

/**
 * @method Bar init()
 */
class Baz extends Foo 
{
}

可选地作为最后的手段——我真的不认为你会需要它,但它在这里是为了完整性。扩展方法并像添加普通方法一样添加返回注释。

/**
 * @return Baz
 */
public function init() 
{
    return parent::init();
}

关于php - 类型提示抽象类单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43188028/

相关文章:

php - 将变量与 $_SERVER ['PHP_SELF' ] 进行比较是否安全?

PHP if语句错误

c++ - 对象的继承和大小

linux - PhpStorm 未检测到 Debian 8 的自定义主题

intellij-idea - 当全局配置为使用空格时,在 IntelliJ/PhpStorm 的 Makefile 中写入制表符?

symfony - phpstorm symfony2 缺少服务警告

php - 在 PHP 中将数组元素添加到子数组

php - 我想将所有GET数据保存在SESSION中,我该怎么做?

c++ - 如何从父类构造函数中引用重写的静态方法?

c++ - 如何在 C++ 中交叉包含类?