如何为IDElogging魔术(_call和_callStatic)方法
在记事本++和崇高的许多愉快的年代之后,我被build议给PHP IDE一个去。 我正在尝试phpStorm,它似乎很好。 代码完成和文档是一个很棒的function,但是在使用魔术方法时不适合我。 有没有办法让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方法允许我们通过构成函数调用的一个或多个参数来获取对象的集合。
我发现在这些情况下有一个@method语句可用,但是phpStorm只是拾取这些语句中的第一个语句。 此外,我只能将返回types设置为混合,因为我希望能够将其设置为所调用的任何类(在我的示例中为b)。
任何意见或build议将非常感激地收到,谢谢。
使用类级别的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
– 返回types -
get_by_user_id
– 方法名称 -
(int $id)
– 方法签名:([[type] [parameter]<, ...>])
-
Bla-bla
– 一些可选的描述
更多关于@method
:
- http://www.phpdoc.org/docs/latest/references/phpdoc/tags/method.html
- https://github.com/phpDocumentor/phpDocumentor2/blob/develop/docs/PSR.md#711-method
PS虽然@method static
在PhpStorm中正常工作(告诉IDE方法是静态的),但实际的phpDocumentor工具可能不支持(对不起,暂时还没有使用它)。
另外 :(当然在PhpStorm) Settings | Inspections | PHP | Undefined | Undefined method --> Downgrade severity if __magic methods are present in class
Settings | Inspections | PHP | Undefined | Undefined method --> Downgrade severity if __magic methods are present in class
Settings | Inspections | PHP | Undefined | Undefined method --> Downgrade severity if __magic methods are present in class
– 它不会以任何方式帮助这些方法的代码完成,但不会将这些魔术方法标记为“未定义的方法”错误。
phpDocumentor关于使用@method
/ @method
标签的RegEx / partial名称的票证 (如何在文档中使用它,以及在处理代码完成时它可能给实际的IDE带来的帮助):
与原始问题有些相关:
你也可以在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();
这样,当魔法发生的时候,你不必去阻止所有的可能性。
有一些文档的细节。