PHPDoc和_ucallstatic tl;博士

PHPDoc和_ucallstatic tl;博士,php,phpdoc,magic-methods,Php,Phpdoc,Magic Methods,对通过\uu callStatic实现的函数进行注释的正确方法是什么?更重要的是:有没有办法让NetBeans和PHPStorm明白这些是静态方法 动机 如果你想了解更大的情况,下面是我如何回答这个问题的 问题:在我当前的项目中,我们有一大堆应该是单例的类(DB代理等)。不用说,我们至少有几百个require_once和$foo=newfooproxy()行 解决方案:我创建了一个Loader类来解决这个问题,使用\uu callStaticmagic方法,所以我们可以说$foo=Loader:

对通过
\uu callStatic
实现的函数进行注释的正确方法是什么?更重要的是:有没有办法让NetBeans和PHPStorm明白这些是静态方法

动机 如果你想了解更大的情况,下面是我如何回答这个问题的

问题:在我当前的项目中,我们有一大堆应该是单例的类(DB代理等)。不用说,我们至少有几百个
require_once
$foo=newfooproxy()

解决方案:我创建了一个
Loader
类来解决这个问题,使用
\uu callStatic
magic方法,所以我们可以说
$foo=Loader::FooProxy()。这对于我们的目的来说是完美的,但是:

问题:这样,团队中使用的两个IDE中显然都没有类型暗示

解决方案:每个模块都定义了
加载程序的一个子类
,添加了只路由到
\uu callStatic
的方法

问题:仅仅为了自动完成而添加实际解释的代码是不可接受的(这可能是有争议的,但让我们暂时接受它)

解决方案:我们不添加任何实际方法,只在PHPDoc中声明如下方法:

<?php
/**
 * @method FooProxy FooProxy()
 */
 class BarLoader extends Loader {}
?>

使类抽象化没有什么区别。大约一个小时的谷歌搜索没有找到解决方案。主要目标是让IDE了解这些功能;拥有正确的PHPDoc并不是必须的。

一般来说,我认为选择使用神奇的东西时要注意的是,必须接受失去自动完成等功能的有效性的权衡

然而,在我使用EclipsePDT(WinXP上PHP5.3.2的Helios)进行的测试中,我能够从一个显式静态方法和两个神奇的静态方法中获得良好的自动完成,这两个方法是我根据您的示例建模的Loader类

简言之,似乎在类docblock中使用@method标记就足以让Eclipse解决问题。如果NetBeans和PHPStorm出现问题,我不确定它是否与“静态”方面有关。。。这可能只是因为对这种动态代码的解析可能超出了它们的自动完成逻辑所要处理的范围

<?php
/**
 * @method BarProxy BarProxy() returns an instance of BarProxy
 * @method BazProxy BazProxy() returns an instance of BazProxy
 */
class Loader
{
    public static function __callStatic($name, $arguments)
    {
        return new $name($arguments);
    }

    /**
     * @return FooProxy
     */
    public static function FooProxy(){
        return new FooProxy();
    }
}

class FooProxy
{
    public function sayCheese() {}
}

class BarProxy
{
    public function eatFries() {}
}

class BazProxy
{
    public function sleep() {}
}

$foo = Loader::FooProxy();
$foo->sayCheese(); // did this simply to verify explicit autocompletion succeeded

$bar = Loader::BarProxy();
$bar->eatFries();  // autocompletion of just "$bar->" brought up "eatFries()"

$baz = Loader::BazProxy();
$baz->sleep();     // autocompletion of just "$baz->" brought up "sleep()"

好吧,PhpStorm 3.0将接受

@method static type name() description

请参阅相关的功能请求

,不幸的是,@方法被两个IDE解析并使用得很好,但它们假设这些方法是动态的。PHPStorm甚至发出警告说我正在静态调用一个非静态方法。看起来我不得不接受这一点,因为在VS代码中也存在“不,那不可能”的回答。
@method static type name() description