【问题标题】:How to document static class properties in PHP如何在 PHP 中记录静态类属性
【发布时间】:2015-05-09 00:19:49
【问题描述】:

鉴于以下情况,您在 Foo 上有一个静态属性记录为 FooApp 的一个实例,一个扩展类 Bar,并且在运行时事实证明该静态属性实际上设置为一个实例的BarApp 而不是FooApp

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

class Bar extends Foo
{
}

Bar::$app = BarApp();

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

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

/**
 * @property BarApp $app
 */
class Bar extends Foo
{
}

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

class Bar
{
    /** 
     * @var BarApp
     */
    public static $app;
}

这有点烦人,因为理论上额外的文档就足够了(例如使用 @property@method 覆盖实例级属性和方法的文档),它会导致额外的代码。

(这里的用例是一个Yii应用——Foo代表BaseYiiBar代表一个扩展它的自定义类;FooApp代表yii\base\ApplicationBarApp代表一个扩展它的自定义类.)

【问题讨论】:

  • 我认为您实际上需要额外的代码,问题是如果您不这样做,那么您实际上可以将 FooApp 传递到您的 Bar 中,而您的代码编写期望的方式是会起作用,这就是您的文档当前所说的。属性应该明确地与 _get 和 _set 魔法方法一起使用,如果你没有这些,那么@property 没有什么可以设置的,虽然我没有使用太多的属性,所以我可能在这里偏离基地
  • 我知道它实际上并没有被强制执行;没关系。我只想让文档反映运行时的实际情况,所以像 PhpStorm 的自动完成这样的东西可以正常工作。
  • 不幸的是,我认为您将不得不明确指出这一点。你可以重构一些其他的代码来解决这个问题,如果你做了一些事情,比如添加一个单例模式,你可以在 Bar::GetApp() 或其他任何东西中显式调用不同的产品。否则,我只是不认为从逻辑上讲,这里没有任何有意义的打字提示,而不是您在上一个令人讨厌的示例中所得到的内容
  • “我尝试了以下方法,但 PhpStorm 不尊重它,可能是因为 @property 不适用于静态属性:” 那么您应该尝试正确的语法:@property static BarApp $app(尽管我仍然不确定它是否会起作用——AFAIK 正确/不动产声明仍然接管,至少在当前的 PhpStorm 版本中)
  • @LazyOne 有趣的是四年后我才发现这个问题,但这仍然不起作用,你的建议也没有 - PHPStorm 只是抱怨 Undefined class static那个语法。看来这根本不可能。

标签: php yii phpstorm phpdoc


【解决方案1】:

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

在撰写本文时,根本没有(官方)文档标签来注释 “magic” 静态属性,PHPDocumentor standardproposed PSR19 中都没有。

如果你是 PH​​P-FIG 的一员(看着你@Chuck Burgess),你可能要考虑将它添加到 PSR19,最好作为 @property 标记的扩展——例如:

 * @property static type $name Free text description

"static" 是一个可选关键字,对于非静态虚拟属性可以省略。

否则,我在 PHPStorm 问题跟踪器上打开了an issue。如果您希望在 PHPStorm 中实现这一点,请考虑为它投票。

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2018-04-18
    • 2011-01-12
    • 1970-01-01
    • 2014-08-27
    • 2012-04-08
    • 2021-03-05
    • 2011-03-04
    相关资源
    最近更新 更多