如何在 PHP 中记录静态类属性

Bra*_*lly 2 php phpdoc yii phpstorm

考虑到以下场景,您将静态属性Foo记录为 的实例FooApp,扩展类Bar,并且在运行时发现该静态属性实际上设置为的实例BarApp而不是FooApp

class Foo
{
    /** 
     * @var FooApp
     */
    public static $app;
}

class Bar extends Foo
{
}

Bar::$app = BarApp();
Run Code Online (Sandbox Code Playgroud)

...什么是记录的正确方法,Bar以便清楚地将其静态$app设置为BarApp实例而不是FooApp

我已经尝试了以下但 PhpStorm 不尊重它,可能是因为@property它不适用于静态属性:

/**
 * @property BarApp $app
 */
class Bar extends Foo
{
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我唯一想到的实际上是$bar在代码中覆盖:

class Bar
{
    /** 
     * @var BarApp
     */
    public static $app;
}
Run Code Online (Sandbox Code Playgroud)

这有点烦人,因为当理论上额外的文档已经足够时,它会导致额外的代码(例如在使用@propertyand覆盖实例级属性和方法的文档的情况下@method)。

(这里的用例是一个 Yii 应用程序 -Foo表示BaseYiiBar表示扩展它的自定义类;FooApp表示yii\base\ApplicationBarApp表示扩展它的自定义类。)

Mor*_*ich 6

请注意:这是一个跟踪答案,可帮助人们从搜索结果到达这里。

在撰写本文时,在PHPDocumentor 标准提议的 PSR19 中都没有(官方)文档标签来注释“神奇”静态属性。

如果您是 PHP-FIG 的一部分(看着您@Chuck Burgess),您可能需要考虑将其添加到 PSR19,最好是作为@property标签的扩展- 例如像这样:

 * @property static type $name Free text description
Run Code Online (Sandbox Code Playgroud)

“静态”作为一个可选关键字可以用于非静态的,虚拟属性可省略。

否则,我已经在 PHPStorm 问题跟踪器上打开了一个问题。如果您希望在 PHPStorm 中实现此功能,请考虑为它投票。