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