92

在使用 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 方法允许我们通过构成函数调用的 1 个或多个参数来获取对象集合。

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

任何想法或建议将不胜感激,谢谢。

4

2 回答 2

159

使用类级别的 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

PS 虽然@method static在 PhpStorm 中工作正常(告诉 IDE 该方法是静态的),但实际的 phpDocumentor 工具可能(还没有?)支持它(抱歉,有一段时间没有使用它)。


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


phpDocumentor@property关于为/标签使用正则表达式/部分名称的票据@method(它对文档的用途以及在处理代码完成时它对实际 IDE 的帮助有多大):

于 2013-03-26T10:17:12.370 回答
6

与原始问题有些相关:

您也可以在 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。

有一些文档了解详细信息。

于 2016-11-27T10:28:35.460 回答