tl;dr
注释(在 PHPDoc 中)通过 __callStatic
实现的函数的正确方法是什么?更重要的是:有没有办法让 NetBeans 和 PHPStorm 理解这些是静态方法?
动机
如果您想了解更大的图景,这就是我如何回答这个问题的。
问题:在我当前的项目中,我们有大量的类实际上应该是单例(数据库代理等)。不用说,我们至少有几百行 require_once
和 $foo = new FooProxy();
行。
解决方案:我创建了一个 Loader
类来解决这个问题,使用 __callStatic
魔术方法所以我们可以只说 $foo = 加载器::FooProxy();
。它非常适合我们的目的,但是:
问题:这种方式在团队中使用的任何一个 IDE 中显然都没有类型提示。
解决方案:每个模块定义一个 Loader
的子类,添加仅路由到 __callStatic
的方法。
问题:为了自动完成而添加实际解释的代码是 Not Acceptable (这可能会有争议,但让我们暂时接受它)。
解决方案:我们不添加任何实际方法,只在 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 并不是必需的。
最佳答案
好吧,PhpStorm 3.0 会接受
@method static type name() description
关于PHPDoc 和 __callStatic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5982312/