首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHPDoc和__callStatic

PHPDoc和__callStatic
EN

Stack Overflow用户
提问于 2011-05-12 18:01:13
回答 2查看 7K关注 0票数 20

tl;dr

通过PHPDoc实现注释(在__callStatic中)函数的正确方法是什么?更重要的是:是否有一种方法可以让NetBeans和PHPStorm理解这些是静态方法?

动机

如果你想了解更大的情况,下面是我要问的问题。

Problem:在我当前的项目中,我们有大量的类应该是单类(DB代理等等)。不用说,我们至少有几百条require_once$foo = new FooProxy();线路。

解决方案:我创建了一个Loader类来解决这个问题,使用了__callStatic魔术方法,所以我们只需说$foo = Loader::FooProxy();。这对我们的目的来说是完美的,但是:

Problem:通过这种方式,在团队中使用的任何一个IDE中显然都没有暗示类型。

解决方案:每个模块都定义了Loader的一个子类,添加了只路由到__callStatic的方法。

Problem:仅仅为了自动完成而添加实际解释的代码是不可接受的(这是可以争论的,但让我们暂时接受它)。

解决方案:我们不要添加任何真正的方法,只在PHPDoc中声明如下方法:

代码语言:javascript
复制
<?php
/**
 * @method FooProxy FooProxy()
 */
 class BarLoader extends Loader {}
?>

ProblemFooProxy不是一个静态方法。下列任何一项都不会使其静态:

代码语言:javascript
复制
<?php
/**
 * @static
 * @method FooProxy FooProxy()
 */

///////////////

/**
 * @static @method A A()
 * @method static A A()
 * @method A static A()
 * @method A A() static
 */

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-14 11:51:11

好吧,PhpStorm 3.0将接受

代码语言:javascript
复制
@method static type name() description

请参阅相关的特性请求http://youtrack.jetbrains.net/issue/WI-4051

票数 39
EN

Stack Overflow用户

发布于 2011-05-12 21:52:21

一般说来,我认为选择使用神奇的东西伴随着必须接受失去像自动完成这样的东西的有效性的权衡。

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

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

代码语言:javascript
复制
<?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()"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5982312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档