Php Inspections EA Extended 3.0.9/Ultimate 2.0.11の新機能

[Php Inspections (EA Extended)]と[Php Inspections (EA Ultimate)]はPhpStormのInspection(コード検査)機能をさらに強力なものに拡張してくれるプラグインです。無償で使えるのがEA Extendedで、それに更に検査ルールを加えたハイエンドの有償版がEA Ultimateです。

本稿では、そのEA Extended 3.0.9(11月30日リリース)、EA Ultimate 2.0.10(12月3日リリース)に追加された新たなチェックツールを紹介します。

[Php Inspections (EA Extended)]: https://plugins.jetbrains.com/plugin/7622-php-inspections-ea-extended-?
[Php Inspections (EA Ultimate)]: https://plugins.jetbrains.com/plugin/10215-php-inspections-ea-ultimate-

## EA Extended/EA Ultimate共通の新機能

### 重複した配列のキー(Duplicate array keys)

配列定義で重複したキーを報告します。配列宣言に同じキーを使用した複数の要素がある場合、最後のものだけが使用され、他のすべての要素は上書きされてしまうからです。

<img width="794" alt="php___Volumes_dev_php__-___Library_Preferences_PhpStorm2018_3_scratches_scratch_php.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/435f54c2-a2b5-b7a8-b776-27b715ed522d.png">

### 疑わしいバイナリオペレーション(Suspicious binary operations)

この検査は様々なケースについて報告します。例えば、traitに対する`instanceof`演算子の使用。これは常に`false`が返ります。

<img width="381" alt="php___Volumes_dev_php__-___Library_Preferences_PhpStorm2018_3_scratches_scratch_php.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/bce72a47-74fd-329f-22dc-f02fc9a5a7cb.png">

代入するつもりなのに、比較演算子`==`が使われている場合。

<img width="334" alt="php___Volumes_dev_php__-___Library_Preferences_PhpStorm2018_3_scratches_scratch_php.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/7cacf41e-467e-c03b-94a4-d9de140cb413.png">

誤って同じ変数同士を比較している場合。常に`true`になるバグです。

<img width="360" alt="php___Volumes_dev_php__-___Library_Preferences_PhpStorm2018_3_scratches_scratch_php.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/a8982ae4-d7d4-e6dc-bb57-6fcd294f61a4.png">

演算子の評価順の関係上、常に`true`になってしまう式。

<img width="665" alt="php___Volumes_dev_php__-___Library_Preferences_PhpStorm2018_3_scratches_scratch_php.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/1be03367-c76f-52b6-ee00-312a98d88424.png">

## EA Ultimate限定の新機能

### 不要な空のチェック(Unnecessary emptiness check)

`isset(...)`と`empty(...)`の問題点とより単純な書き方を報告します。

<img width="520" alt="Banners_and_Alerts_and_php___Volumes_dev_php__-___Library_Preferences_PhpStorm2018_3_scratches_scratch_php.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/e11ec367-65c6-72f9-03cf-a7559ec23f02.png">

### コンストラクタはインターフェイスに依存しよう(Interfaces as constructor dependencies)

コンストラクタに注入されるオブジェクトの型がインターフェイスでない場合に報告します。次の例は、`Connection`インターフェイスがあるのに、具象クラスの`MySqlConnection`を注入しています。テスタビリティを考えると、具象よりもインターフェイスに依存したほうがいいはずです。

<img width="821" alt="Banners_and_Alerts_and_php___Volumes_dev_php__-___Library_Preferences_PhpStorm2018_3_scratches_scratch_php.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/5e0c335c-ba93-1e2b-d516-814aed070565.png">

なお、インターフェイスを実装していない具象クラスの注入は無視するオプションもあります。

### テストしずらいAPI(Testing unfriendly APIs)

設定したしきい値を超えてモックをたくさん持っているテストケースについて報告します。複雑なモッキングは、設計の筋の悪さや単体テストの学習コストの増加、テストの保守性の低下などの問題があることの現れです。モックが`new`で暗黙的に作られる場合や、`setConstructorArgs([...])`で呼び出されるものはカウントされません。

<img width="771" alt="Banners_and_Alerts_and_php___Volumes_dev_php__-_____packages_our-activity-qiita-org-stats_tests_FooTest_php__php_.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/37cc7ab5-9cda-03cd-8459-5bb5af92028e.png">