sifue's blog

プログラマな二児の父の日常 ポートフォリオは www.soichiro.org

PHP開発においてVimやST2にはできないけれどPHPStromにはできる10のこと

【blog.soichiro.orgの閉鎖にともない転載しました】

f:id:sifue:20140429122030p:plain


今まで散々VimSublime Text2のエントリーばかり書いていた自分ですが、運良くIntelliJ IDEA UltimateのオープンソースライセンスをJet Brain社から頂いたこともあってPHPStorm (IntelliJPHPプラグイン)を利用し始めました。 このスクリーンショットのようなUIです。

PHPStorm、さすがは有料のPHP用のIDEだけあってST2やVimプラグインでできる機能とは格が違う自動生成やリファクタリング機能を持っています。お値段はコマーシャルライセンスで$199、個人で$99、学生で$29という高価格帯。にも関わらず、FacebookMediaWikizyngaVALVE(洋ゲー販売のSteamで有名な)で正式採用されるIDEなだけあります。

ぶっちゃけて言うと、このクソ言語を使って大規模開発をせざるを得ないPHPerで、懐に余裕のある方にはぜひオススメしたいIDEです。
一日3時間以上PHPを書いたり、読んでいたりする人は買って損はないかと思いますが、ただこの価格なので無理強いすることはできません。なので、利用するかどうかの判断材料になるようにとVimやST2にはできないけれどPHPStormにはできる機能だけをまとめることにしました。

ちなみに、それVimやST2でもできるよ、って言いたくてVimプラグインやST2のパッケージを作って下さる方もいるとは思いますが、2013年3月12日時点で自分が満足にいく拡張を見つけられなかったものだけをまとめてあります。

1. 型情報のあるコメントを補完するゲッターセッターの自動生成

GetterSetterのジェネレーターというのは結構エディタにもプラグインが存在しているのですが、型情報のコメントまで丁寧に作ってくれるジェネレーターはなかなかありません。以下の様な手順です。

f:id:sifue:20140429122049p:plain


以上のエンティティクラスで右クリックしてGenerate...を選択します。

f:id:sifue:20140429122107p:plain


その後出てくるコマンドでGetters Settersを選択します。

f:id:sifue:20140429122120p:plain


GetterやSetterを生成したいフィールドを選択します。

f:id:sifue:20140429122133p:plain


このように型情報コメントを保管するゲッターセッターを自動生成してくれます。

f:id:sifue:20140429122148p:plain


さすがにここまでやってくれるエディタのプラグインはありませんでした。

2. コンストラクタの自動生成

ゲッターセッターの自動生成プラグインは結構な数あるのですが、コンストラクタの自動生成は中々ありません。先ほどのエンティティクラスで右クリック、Generate...で出てくるコマンドで、Constructorを選択します。

f:id:sifue:20140429122209p:plain


コンストラクタで代入したいフィールドを選択します。

f:id:sifue:20140429122230p:plain


このように簡単にコンストラクタが自動生成されます。

f:id:sifue:20140429122243p:plain

3. オーバーライド可能なメソッドの自動生成

継承クラスのオーバーライドしたいメソッドも自動生成してくれます。以下のようにまずクラスを継承します。

f:id:sifue:20140429122301p:plain


その後、また右クリックのGenerate...からOrveride Methods...を選択します。

f:id:sifue:20140429122331p:plain


次にオーバーライドしたいメソッドを選択します。

f:id:sifue:20140429122346p:plain


すると以下のようにメソッドが自動生成されます。

f:id:sifue:20140429122354p:plain

4. 未実装のインターフェースのメソッドの自動生成

クラス宣言のimplements句にインターフェースを設定します。メソッドが未実装なので赤いラインでエラーが出ていますが、右クリックのGenerate...からImplement Methods...を選択します。

f:id:sifue:20140429122409p:plain

 

f:id:sifue:20140429122419p:plain


ここで、実装したいメソッドを選択します。

f:id:sifue:20140429122430p:plain


このように、実装しなくてはいけないメソッドが自動生成されます。

f:id:sifue:20140429122441p:plain

5. メソッドの呼び出し階層の表示

メソッドの呼び出しがどこで行われているのかを、再帰的に知りたい場合はメソッドを選択して、メニューのNavigateからCall Hierarchyを選択します。

f:id:sifue:20140429122458p:plain


すると、再帰的にどういうふうにメソッドが呼ばれているのか見ることができます。

f:id:sifue:20140429122508p:plain


この場合は、handleメソッドを呼んでいるstartメソッドが更にBasicAuthenticationLitenerのhandleメソッドから呼ばれていることがわかります。

6. クラス名、メソッド名、変数名の全ファイル自動リファクタリング

命名を変更するリファクタリングも強力で、全てのファイルを自動的に修正してくれます。まずクラス名などを選択して右クリック、Refactor > Rename...を選択します。

f:id:sifue:20140429122518p:plain


変更したいクラス名を入力します。

f:id:sifue:20140429122536p:plain


ファイル自体の変更を確認したOKを押すとリファクタリング完了です。

f:id:sifue:20140429122548p:plain


ファイル名はもちろんのこと、全ての呼び出し元のクラス名が修正されます。非常に強力です。

f:id:sifue:20140429122559p:plain

 

f:id:sifue:20140429122609p:plain


ただしこのリファクタリング、全ファイルを自動的に書き換えるという強力さ故にUndoはできないようですので、慎重に実施ください。

7. 変数、定数、フィールドへの抽出

変数、定数、フィールドへのくくりだしも簡単です。変数にくくり出したいときは、くくりだしたい部分を選択して、右クリックRefactor > Extract > Variableです。定数の場合はConstant、フィールドの場合はFieldを選択します。

f:id:sifue:20140429122630p:plain

 

f:id:sifue:20140429122642p:plain


変数名は何がいいか聞かれるので入力します。

f:id:sifue:20140429122653p:plain

f:id:sifue:20140429122707p:plain


このように変数に抽出されます。

8. 処理のメソッドへのくくり出し

処理のメソッドへのくくりだしも自動です。どの変数使ってるんだっけなというように頭を悩ませることもありません。処理を選択して、右クリック Refactor > Extract > Methodを押します。

f:id:sifue:20140429122722p:plain

 

f:id:sifue:20140429122734p:plain


メソッド名と引数の順番を聞かれるので設定します。

f:id:sifue:20140429122746p:plain


このように処理がメソッドに抽出されます。

f:id:sifue:20140429123633p:plain

9. 使ってないインポート文(use句)の表示

使ってないインポート文はこのように、灰色に表示されてわかりやすくなっています。

f:id:sifue:20140429123639p:plain

10. タイプヒンティングとデフォルト値を元に型情報を補完するPHPDocの自動生成

GetterSetterの所で型情報の入ったコメントが自動生成されるので基本的に同じなのですが、ファイル上で右クリックしてGenerateを選択した後、PHPDoc Blocks..を選択します。

f:id:sifue:20140429123702p:plain


次にPHPDocを生成したいメソッドを選択します。

f:id:sifue:20140429123731p:plain


このように、タイプヒンティングとデフォルト値を元に自動的に型情報を持ったPHPDocを自動生成してくれます。うーん便利。

f:id:sifue:20140429123741p:plain

以上です。まとめると、

1. 型情報のあるコメントを補完するゲッターセッターの自動生成
2. コンストラクタの自動生成
3. オーバーライド可能なメソッドの自動生成
4. 未実装のインターフェースのメソッドの自動生成
5. メソッドの呼び出し階層の表示
6. クラス名、メソッド名、変数名の全ファイル自動リファクタリング
7. 変数、定数、フィールドへの抽出
8. 処理のメソッドへのくくり出し
9. 使ってないインポート文(use句)の表示
10. タイプヒンティングとデフォルト値を元に型情報を補完するPHPDocの自動生成

これが自分がまとめたVimやST2にはない、PHPStormの機能でした。
細かい所で言うと各種タグジャンプや補完機能、シンタックスハイライトやコードスタイルの設定などもIDEならではの上をゆく便利さがあります。ただこのへんの機能は頑張ればVimやST2でもある程度用意可能なので割愛します。

なお自分は、リモートのPHPファイルを編集する必要があったので、ローカルにバージョン管理システムを使ってチェックアウトしたソースコードをPHPStormのDeployment機能のAutomatic Upload機能を使って、リモートのマウントしているディレクトリに自動送信させて使っています。

リモートにしかPHPが動かせるサーバー環境があいよという方は、このようにSSHSambaなどでリモートディレクトリをマウントして、Deployment機能を使ってやるこのやり方がよいと思います。ちなみに最初はマウントしたリモートディレクトリをそのままPHPStormのワークスペースとして利用しようとしましたが、あまりの重さに使い物になりませんでしたw

一応PHPStormは30日間は無料でお試しできますので、一度は使ってみるのも一つなのではないかなと思います。
以上、ここまで読んでくださり誠に頂きありがとうございました。