经过许多快乐时光在记事本++和崇高的编码,我已经被告知给一个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)。
任何意见或建议,将非常感激地收到,谢谢。
使用类级别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
:
- 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工作正常通过实际的phpDocumentor工具支持(IDE告诉该方法是静态的),它可能不(没?)(抱歉,没有使用过了一段时间)。
或者 :(在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的的使用正则表达式/部分名称关于车票 @property
/ @method
标签(怎么会这样的文档资料和帮助,我很少与代码完成交易时,可能会带来实际的IDE很有用):
- https://github.com/phpDocumentor/phpDocumentor2/issues/689
多少与原来的问题:
您还可以在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每一种可能性。
有一些文档的详细信息。