如何记录 IDE 的魔术(_call和_callStatic)方法

在用记事本++和崇高编码的许多快乐岁月之后,我被建议尝试一下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();

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

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

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


答案 1

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

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


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


phpDocumentor 关于使用 RegEx/部分名称 / 标记的票证(它对文档有何用处,以及在处理代码完成时它可能给实际 IDE 带来的帮助有多小):@property@method


答案 2

与原始问题有些相关:

您也可以在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();

这样,当魔术发生时,您不必阻止所有可能性。

有关详细信息,请提供一些文档。


推荐