2013-03-26 74 views
56

在记事本+ +和崇高编码经过许多愉快的岁月后,我被建议给PHP IDE一个去。我正在尝试phpStorm,它看起来不错。代码完成和文档是一个很棒的功能,但在使用魔术方法时不适合我。 有没有办法让phpStorm了解魔术方法中发生了什么?如何为IDE记录魔术(_call和_callStatic)方法

我们的情况是这样的:

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)。

任何意见或建议将非常感激地收到,谢谢。

+1

为什么_ANYONE_认为覆盖'_call'是个好主意? – 2014-12-12 00:45:13

+0

需要说的是,如果任何理智的人会发现这个问题,Brian会对此发表评论。魔术方法适用于所有的意图和目的:不可文档化(尝试将一个(n)[参数| precondition | postcondtion |异常]记录到一个魔术方法中),而不是IDE友好的(尝试调试一个魔术方法),对重构(请,甚至不要考虑尝试在一个软件中重构一个神奇的方法),和LAZY(好吧,最后一个可能会被解释为一个观点)。 – 2016-08-03 00:26:41

+4

-1与@ LukeA.Leber在评论中的观点相一致,因为它证明缺乏愿景。虽然魔术方法不是编写更少代码的一种方式(如果你使用它们是懒惰的),但魔术方法使体系结构成为可能,否则这种体系就不可能实现,或者那将非常复杂,不值得编写。使用PHPDoc时,它们完全是IDE友好的。 请注意,大多数时候你并不需要神奇的方法,但是当你需要它们时,就没有替代品(以PHP的形式)。当它们以非常结构化的方式使用它们时,它是一个完整的有效解决方案。 – MikeSchinkel 2017-11-04 03:05:05

回答

102

使用类级别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 - 它不会与代码完成以任何方式方法有所帮助,但不会标记那些神奇的方法为“未定义的方法”的错误。


的phpDocumentor的门票使用正则表达式/部分名称为@property/@method标签(怎么会这样的文档资料和帮助,我很少与代码完成交易时,可能会带来实际的IDE很有用)有关:

+1

谢谢,这看起来像一个合理的建议,它当然在phpStorm中工作,但我有点讨厌写出每个类顶部的潜在数百行@method。您会看到get_by_ *方法可以由任何对象参数作为前缀,以通过指定的参数获取该类型的对象。即使排除了get_by _ * _和_ *的可能性,我最终会在14​​0个不同的类中使用大约1500个“@ methods”。有没有更通用的方式来提供文档? – 2013-03-26 10:57:48

+0

不需要。所有的魔法方法都必须特别声明(这是记录这种方式的要点) - PHPDoc不理解部分名称(例如'get_by _ *(int $ id)')。对于IDE(代码检查,不完成!),你有alt解决方案(禁用警告)。对于phpDocumentor(或替代工具) - 没有解决方案,我知道(也许它在那里,但我不知道它)。你有链接到github - 提交新票并要求添加匹配功能的“部分名称” - 看看他们会说些什么(很可能会被拒绝)。如果它将被实现,那么IDE可能会在稍后进行。 – LazyOne 2013-03-26 11:30:09

+0

https://github.com/phpDocumentor/phpDocumentor2/issues - 但请检查在发布你的消息之前是否有类似的消息不存在。 – LazyOne 2013-03-26 11:32:47

3

一定的相关性原题:

你也可以在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了解详情。

+0

这不适用于__call。它也没有记录和无效的PHP。 PHPStorm仅为静态定义的方法提供支持,这些方法根据输入返回混合类型。 – jgmjgm 2018-02-07 11:48:04