如何为IDE记录magic(__ call和__callStatic)方法

时间:2013-03-26 09:55:00

标签: php documentation phpstorm magic-methods docblocks

在使用notepad ++和sublime编写许多快乐的岁月之后,我被建议给PHP IDE。我正在尝试phpStorm,看起来不错。代码完成和文档是一个很好的功能,但是当使用魔术方法时,对我来说并不奏效。 是否有办法让phpStorm了解魔术方法中发生了什么?

我们的情况是这样的:

abstract class a {
    public static function __callStatic($method,$args)
    {
        if(strpos($method,"get_by_") === 0)
        {
            //do stuff
        } elseif(strpos($method,"get_first_by_") === 0) {
            //do stuff
        } elseif($method == "get_all") {
            //do stuff
        }
    }
}

class b extends a {
    // some more stuff
}

b::get_by_user_id(27);
b::get_first_by_id(156);
b::get_all();

神奇的callStatic方法允许我们通过构成函数调用的一个或多个参数来获取对象的集合。

我看到在这些情况下有一个@method语句可供使用,但phpStorm只是获取了这些语句中的第一个。此外,我只能将返回类型设置为混合,因为我希望能够将其设置为调用的任何类(在我的示例中为b)。

非常感谢任何想法或建议,谢谢。

2 个答案:

答案 0 :(得分:131)

使用类级别的PHPDoc注释 - 特别是 @method 标记 - 在PhpStorm中正常工作:

/**
 * @method static someClass get_by_user_id(int $id) Bla-bla
 * @method static someClass get_first_by_id(int $id) 
 */
abstract class a {
...

在上面:

  • @method - PHPDoc标记
  • static - 告诉这是静态方法
  • someClass$this - 返回类型
  • get_by_user_id - 方法名称
  • (int $id) - 方法签名:([[type] [parameter]<, ...>])
  • Bla-bla - 一些可选说明

有关@method的更多信息:

<强> P.S。 虽然@method static在PhpStorm中工作正常(告诉IDE该方法是静态的)但实际的phpDocumentor工具可能不支持(但是?)(抱歉,暂时没有使用它)。


或者 :(当然,在PhpStorm中)Settings | Inspections | PHP | Undefined | Undefined method --> Downgrade severity if __magic methods are present in class - 它不会以任何方式帮助完成此类方法的代码,但不会将这些魔术方法标记为“undefined”方法“错误。


关于使用@property / @method标签的RegEx /部分名称的

phpDocumentor's ticket (它如何对文档有用,以及它对实际IDE的帮助有多小在处理代码完成时):

答案 1 :(得分:4)

与原始问题有些相关:

你也可以在phpstorm元文件中定义它。以下是工厂方法(v2016.3)的示例:

// Define in .phpstorm.meta.php
namespace PHPSTORM_META {
    $STATIC_METHOD_TYPES = [
        \Factory::create('') => [],
    ];
}

// Then use in code
$factory = new \Factory();
$user = $factory->create(\User::class);
// Here you get autocomplete.
$user->subscribe();

这样一来,当魔法发生时,你不必对每种可能性进行docblock。

有一些docs了解详情。