PhpStorm ユーザーのための IntelliJ IDEA ハンズオン のすすめ

「IntelliJ IDEA ハンズオン」、献本いただきました。著者であり、JetBrains 代理店サムライズムの代表でもある山本祐介さん、ありがとうございます。

f:id:tanakahisateru:20171105040830j:plain

http://amzn.asia/0ELFU8Qamzn.asia

JetBrains の IDE 製品は大好物で、普段からとてもお世話になっています。ということで、さっそく読ませてもらいました。

読み始めて真っ先に思ったのは、これ PHPer でも買って全然損ないな、です。

現在の PHP は、文法的にも、技術文化的にも、非常に Java に似た言語となりました。なので、Java を中心に解説されている本だとはいえ、その解説の半分以上は PHP と PhpStorm でも活かせる内容だと感じました。

本書は二部構成になっていて、第一部はこんな感じ...

  1. HTMLとCSSとJavaScriptの記述を通じて操作感を練習
  2. 思いつくかぎり最短のキーストロークでエディタ操作、クラス実装
  3. xUnit系単体テストとその実行 + デバッガの操作
  4. Gitをベースにバージョン管理機能の説明
  5. DBのGUIフロントエンドの説明

どうですかこの Java 感のなさ。どの言語ででも応用できますよね。とくに PHP は、Java に似ているおかげですごく無駄がない感じ。

で、この調子で書かれた第一部が、全ページ構成のだいたい 65% を食っています。残りの 35% が第二部、そっちはわりと IntelliJ と Java に固有な内容になっていきます。

とはいっても、あえて IntelliJ に他の言語のプラグインを入れて使っている人なら、プロジェクトとモジュールの概念や、各言語専用 IDE の機能と Ultimate 用プラグインの関係を把握しないとなので、本当に全編 Java 固有 (というか Java EE) な章は全 10 章中の 1 章だけでした。

これでこの値段なら、ということで買って損はない一冊ですどうぞ。

PhpStormでやるならこう

ってまあ、こんだけ勧めていざ PHP だと話違うやんって苦情出るといけないので、買った人のために、PHP での差分を補足しますね。まだ読んでない人には意味わからんかもですが、買ってからまた来てください。

この本の内容、 PhpStorm でもっともギャップが大きいのは、「MavenやGradle」と書かれたところが「Composer」に置き換わることと、「JUnit」が「PHPUnit」になる部分、そう、基本的なプロジェクト構成です。

前準備

WordPress 等の Composer を使わない文化でないかぎり、まず PHP composer.json support プラグインをインストールしておきましょう。Plugins Browse repositories... から composer で検索します。

f:id:tanakahisateru:20171105023328p:plain

プロジェクト作成

f:id:tanakahisateru:20171105041457p:plain

新規プロジェクト作成では、CLI Interpreter を指定します。初めてPhpStormを起動したときは、ここに選択するものがないと思います。となりの ... ボタンから、自分の PHP のインストールパスを定義するウィンドウで少なくともひとつのインストール先を指定してください。

f:id:tanakahisateru:20171105041920p:plain

空のプロジェクトができたら Terminal を Option + F12 で開きます。ここは、OS標準のコマンドラインシェルと同じです。PHP は Java よりも CLI に触れる機会が多いので、ぜひ活用してください。

f:id:tanakahisateru:20171105042226p:plain

Composer を使って PHPUnit を使えるようにします。こうすると、もっともお手軽に composer.json ファイルと PHPUnit が準備できます。

f:id:tanakahisateru:20171105042355p:plain

出来上がった composer.json を開いて、autoload を追加します。先にインストールしたプラグインのおかげで、Composer のキーワードが補完できるようになっています。

    "autoload": {
        "psr-4": {
            "Acme\\FizzBuzz\\": "src"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Acme\\FizzBuzz\\": "tests"
        }
    },

f:id:tanakahisateru:20171105042625p:plain

うまく動いてくれれば、インテンションアクション (豆電球 / Option + ENTER) から、src と tests のフォルダを作成することができます。

ここでいったんプロジェクトを閉じて、再度開きます。

プロジェクト設定

本当は、再起動せずにプロジェクト設定を続けることはできるのですが、あえて、PhpStormの「それなりのcomposer.json があるプロジェクトなら、開いたらすぐに自動設定してくれる」機能を発動させてみます。

f:id:tanakahisateru:20171105043304p:plain

開くとこんなメッセージが表示されるので、すかさず Initialize をクリックします。

f:id:tanakahisateru:20171105043351p:plain

Synchronize IDE Settings with composer.json にチェック、OKします。すると...

f:id:tanakahisateru:20171105043526p:plain

また何か勝手に動作したようなメッセージが。これは、composer.json の autoload の名前空間とディレクトリを対応付けし、PHPUnitの設定も済ませた、という意味です。

f:id:tanakahisateru:20171105043944p:plain

ポップアップで操作した Composer の設定はここにあります。

f:id:tanakahisateru:20171105043748p:plain

ディレクトリ設定はここです。ソースとテストに自動で十分な設定が行われています。

f:id:tanakahisateru:20171105044040p:plain

PHPUnit はここです。Composer でインストールしたものを自動的に認識しています。

「開き直してダイアログでOKしただけ」で、勝手にいろいろできてしまいました。便利ですが、何が起こっているのかわからなくなる恐れもあります。もし「あれ?」と思ったら、主にこのあたりの設定を確認すればいい、と理解してください。

autoload を書き換えたのに composer install を実行していなかったので、このままではまだ自分の書くクラスがロードされません。PhpStorm にやらせましょう。composer.json のコンテキストメニューから...

f:id:tanakahisateru:20171105044549p:plain

f:id:tanakahisateru:20171105044628p:plain

FizzBuzz実装

f:id:tanakahisateru:20171105044722p:plain

Cmd + N で src 下にクラスを作成しようと思います。ファイルの種類を選択するポップアップが出ている状態で、おもむろに class のようにタイプしてみてください。

f:id:tanakahisateru:20171105044846p:plain

何文字か入力すると、選択項目が絞り込まれます。

この「ポップアップリストからの突然のタイピング」はいろいろな箇所で使えて便利な技です。最近使用したファイル (Cmd + E) やクラスの Structure ポップアップ (Cmd + F12) で素早く目的の項目にアクセスできます。バージョン管理メニュー (Ctrl + V) やリファクタリングメニュー (Ctrl + T) でも有効です。

f:id:tanakahisateru:20171105045405p:plain

プロジェクト設定ができているので、クラス作成ダイアログでは、ディレクトリと名前空間が正しく埋まっています。(うまく設定できていなければ、このダイアログで名前空間が空白になります)

f:id:tanakahisateru:20171105045628p:plain

クラスから Cmd + Shift + T でテストを作成/行き来できるのは Java と同じです。

f:id:tanakahisateru:20171105045727p:plain

PHPUnit 6+ format にチェック。

f:id:tanakahisateru:20171105045814p:plain

f:id:tanakahisateru:20171105045909p:plain

PHPUnit のコードだと認識すれば Cmd + N に PHPUnit Test Method が追加されます。

f:id:tanakahisateru:20171105045933p:plain

現在は test プレフィクス形式ですが、近いバージョンアップで、ここで生成されるコードの雛形をカスタマイズできるようになります。そうなれば @test アノテーション形式のテストも可能です。

テストの実行

JUnit の場合は、テストケースのメソッドにアイコンが表示されますが、PHPUnit には現在アイコン表示がありません。しかし、クラス名やメソッド名を右クリックすれば、実行したいテストだけを実行することができます。

f:id:tanakahisateru:20171105050343p:plain

f:id:tanakahisateru:20171105050348p:plain

Run と Debug を選択することができます。もし PHP に Xdebug がインストールされていれば、本書の Java のデバッグと同様に、ブレークポイントからステップ実行できます。(ただし PHP には、スタックフレームを巻き戻すようなすごい機能はありません)

f:id:tanakahisateru:20171105050422p:plain

また、phpunit.xml があれば、その右クリックから簡単に、テストスイートすべてを実行できます。

f:id:tanakahisateru:20171105050810p:plain

もともと PHPUnit は、JUnit と異なり、CLI しか持っていません。にもかかわらず、その実行結果をうまく JUnit と同じような GUI で表現してくれます。CLI の出力はそのまま読め、また、表示されているファイルパス + 行番号は、クリックしてすぐそこに移動することができます。

その他

Java では psvm -> TAB であの面倒な記述の public static void main(...) メソッドを作成しましたが、PHP でも pubsf で public static function () { ... } と展開できます。ほか、pubf や prif といった Live Template が最初から定義してあります。

f:id:tanakahisateru:20171105051753p:plain

__DIR__ を使った場合のファイルパスの補完が便利です。また、実在しなければ警告となり、インテンションアクションで後から作成、もできます。

f:id:tanakahisateru:20171105051926p:plain

f:id:tanakahisateru:20171105051933p:plain

Web サーバーのドキュメントルートにあたるディレクトリを Resource Root としておくと、URL を補完でき、また、実在しない場合の警告を活かすことができます。

f:id:tanakahisateru:20171105052443p:plain

これは IntelliJ も共通ですが、バージョン管理中に変更のあったファイルは、コミットダイアログを出すまでもなく、Show Diff (Cmd + D) で大きなウィンドウに差分表示されます。もちろんこれの右側も編集できるエディタです。これ、単に個人的に、コミットダイアログを出さずに済むので気に入っててオススメですよってだけです。

本の章立ての中では目立たないですが、(S)FTP クライアントと REST クライアントの紹介、ありがたいです。見落とさないでください、PHPer ならいつかきっと役に立ちますよ。

IntelliJ IDEA Ultiname の Java 開発者向け機能は、値段だけのことはあって、公式が非常に充実していますが、PhpStorm は、サードパーティプラグインがかなり活躍します。各言語の中で、PhpStormはPHPの方言みたいなののプラグインが、もっとも多いんじゃないでしょうか。なので、自分のフレームワークや重視したい技術キーワードで、まずはいちどプラグインを検索してみてください。


差分でわかりにくいって人には、少し古いですが、PhpStorm 2016.3 入門動画を作りました - なんたらノート第三期ベータ が参考になるかもしれません。カバーする領域だいたいかぶってます。

...で

まあじっさい、編集も設定も、こんなにスムーズに使えることはないです。わりと毎回試行錯誤だったり、無駄な操作してたりです。

もし「うわ... こんなにうまくいかない」と思っても、最初はぜんぜん大丈夫。とにかく意図したとおりにコードを入力できさえすれば、それだけで十分で、あと IntelliJ は勝手に役立ってくれてて、いつの間にか助けてくれてるんで。

でもせっかく高い買い物したんなら、あとたった2894円だけ出して近道行ったほうが、お得じゃないでしょうか。ライセンスの有効期限もあることだし。