2013-03-26 75 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