tl;博士
注释(在 PHPDoc 中)通过实现的函数的正确方法是什么__callStatic
?更重要的是:有没有办法让 NetBeans和PHPStorm 明白这些是静态方法?
动机
如果您想要更大的图景,这就是我提出这个问题的方式。
问题:在我当前的项目中,我们有很多真正应该是单例的类(数据库代理等)。不用说,我们至少有几百require_once
行$foo = new FooProxy();
。
解决方案:我创建了一个Loader
类来解决这个问题,使用__callStatic
魔法方法,所以我们可以说$foo = Loader::FooProxy();
。它非常适合我们的目的,但是:
问题:这种方式显然在团队中使用的任何一个 IDE 中都没有类型提示。
解决方案:每个模块定义一个子类Loader
,添加只路由到的方法__callStatic
。
问题:仅仅为了自动完成而添加实际解释的代码是不可接受的(这可以争论,但让我们暂时接受它)。
解决方案:我们不要添加任何真正的方法,只在 PHPDoc 中声明方法,如下所示:
<?php
/**
* @method FooProxy FooProxy()
*/
class BarLoader extends Loader {}
?>
问题:FooProxy
不是静态方法。以下都不是静态的:
<?php
/**
* @static
* @method FooProxy FooProxy()
*/
///////////////
/**
* @static @method A A()
* @method static A A()
* @method A static A()
* @method A A() static
*/
使类抽象没有区别。大约一个小时的谷歌搜索没有找到任何解决方案。主要目标是让 IDE 了解这些功能;拥有正确的 PHPDoc 并不是必需的。