PhpStormでPHP5.6→PHP7系の互換性をチェックする

katsuraCompatibility, PHP, PHP5, PHP7, PhpStorm, 互換性

開発グループの katsura です。
今月2018年12月というのは、PHP を利用している企業にとっては大きなニュースのある月でした。そのニュースとは PHP5.6 に対しての PHP 公式のサポートの期限切れ です。PHP7 系への移行作業を行った方も多いのではないでしょうか。私も PHP7 系への移行作業を行い苦労したのですが、そんな移行作業にて役に立ったツールの組み合わせについて、今回は紹介したいと思います。

概要

今回紹介するのは、PhpStorm と PHP Compatibility を組み合わせ、IDE 上で PHP の互換性のチェックをする方法です。

世の中には CUI 上で PHP の互換性をチェックするツールの紹介をしている記事も多いので、CUI 上でチェックできれば十分ではないかと思う人もいるかも知れません。確かに、修正しないといけない点が数行程度であれば CUI 上で表示されている結果を元に修正するのでも、それほど手間ではないので問題ないかもしれません。しかし、私が関わった移行作業では数十箇所の指摘点が発見されてしまったので、これを直すために 1 つ 1 つファイルを開くだけでもかなり手間がかかる状況でした。その点、IDE 上で互換性のチェックの結果を見る方法であれば、ダブルクリック一つで修正ファイルを開いて、修正箇所までジャンプしてくれるので、楽に修正を行えました。

対応する PHP のソースの規模が大きい場合には、それに比例して修正しないといけない箇所も多くなると思いますので、そのような場合には、今回紹介する IDE を利用した互換性のチェックが役立つと思います。

ちなみに、今回のツールで確認できる PHP 互換性は PHP5.6 からのバージョンアップだけでなく、PHP7 内でのマイナーバージョンアップ (7.0 → 7.2 等) での確認も可能ですので、既に PHP7 系を利用している方にも役に立つかと思います。

今回使うツールについて

    • Chocolatey
      • Windowsでパッケージ管理するためのソフトです。
      • Windows版のPHPやComposer、PhpStormをインストールするのに利用します。
      • 別の方法でPHPやPhpStormをインストールしている場合には不要です。
    • PHP
      • ComposerやCode Snifferなどを動かすのに利用します。
    • Composer
      • PHPのライブラリのパッケージを管理するためのソフトです。
      • 今回はCode Sniffer・PHP Compatibilityをインストールするのに利用します。
    • Code Sniffer
      • PHPの文法チェックをするためのツール
      • チェックする文法はプロファイルで指定できます。
    • PHP Compatibility
      • PHPの互換性チェックしてくれる Code Sniffer のプロファイルです。
    • PhpStorm
      • 皆さん使っているであろう定番IDEです。
      • Netbeans などフリーの IDE でも開発出来るかもしれませんが、有料ソフトのほうが使い勝手が良かったり、新しい PHPの文法への対応が早いというメリットもあります。
      • PHP7 系への移行をきっかけに開発環境も見直してみて、PhpStormを導入することも検討してみるのも良いのではないかと思います。

設定手順

今回は、Windows7, Windows10 でのインストール経験を元に設定手順を紹介します。
他の OS での設定は試してはいませんが、パッケージ管理ソフトとして Chocolatey を利用している部分をそれぞれの OS のパッケージ管理ソフト(Homebrew等)に置き換えたり、パス設定をOSごとのものに揃えれば、同様な設定はできるかと思います。

  1. Chocolatey をインストール
    • https://chocolatey.org/install を参考に、Chocolateyをインストールします。
    • いろいろと書かれてはいますが、やることはコマンドプロンプトを管理者権限で実行して、コマンドを一発実行するだけです。
  2. PHP・Composer・PhpStormをインストール
    • コマンドプロンプトを管理者実行し、ChocolateyのコマンドでPHP・Composer・PhpStormをインストールします。
    • 既に PHP や PhpStorm をインストールしている場合には不要です。
    • > choco install php composer phpstorm
  3. Code Sniffer・PHP Compatibilityをインストール
    • コマンドプロンプトを一般ユーザで、以下のコマンドを実行し、Code SnifferとPHP Compatibilityをインストールします。
    • > composer global require wimg/php-compatibility require "squizlabs/php_codesniffer=*"
  4. PhpStormにCode Snifferを設定
    • PhpStormを開き、メニューのFile → Settings を選択し、PhpStormの設定画面を開きます。
    • 設定画面の左のメニューから Language & Frameworks → PHP → Code Sniffer の順に選択していきます。その際、検索欄にCode Snifferと入れるとフィルタリングされて見つけやすいです。
    • Configuration を Local に設定し、プルダウン右の「…」ボタンを選択すると、Code Snifferのパス設定画面が出てきます。
    • インストールしたCode Snifferのパスを設定し、Validateを押して特にエラーが出なければ、OKを押します。
    • Code Sniffer のパスは、Chocolateyで入れた場合には以下のパスになるはずです。
    • C:\Users\<ユーザ名>\AppData\Roaming\Composer\vendor\squizlabs\php_codesniffer\bin\phpcs.bat
  5. PhpStormのにCode Snifferのプロファイルとして PHP Compatibility を設定
      • 設定画面の中から、Editor → Inspections → PHP → PHP Code Sniffer validation を 開きます。検索欄に PHP Code Sniffer validation と入れるとフィルタリングされて見つけやすいです。
      • PHP Code Sniffer validation右のチェックボックスにチェックを付け、Code Standard 右の更新ボタンをクリックし、Code Standard のプルダウンから Custom に選択します。
      • その後、「…」ボタンをクリックし、PHP Compatibility のパスを設定し、設定は完了です。
      • PHP Compatibility のパスは、 Chocolatey で入れると以下のパスになるはずです。
      • C:/Users/<ユーザ名>/AppData/Roaming/Composer/vendor/wimg/php-compatibility/PHPCompatibility

実行方法

メニューの Code → Inspect Code を選択し、Whole projectを選択した状態でOKを押すとレポジトリ内のソースが全てチェックされ、非互換なソースが一覧で表示されます。

全てをチェックすると時間がかかるので、ライブラリのソースやjsソースなどを除外したい場合にはCustom Scopeの右にある「…」ボタンを選択するとフォルダごとの対象設定・除外設定を行えます。

PHP Compatibilityを使ってみての感想について

PHP Compatibility を使うと、非互換になった関数の洗い出しや、古い PHP 文法が残っている箇所の洗い出しについては、高い精度での洗い出しをしてくれて大変助かりました。例えば、PHP7.2 では each 関数が非推奨になり、PHP7.0では古いコンストラクタ定義が非推奨になりましたが、これらについては、PHP Compatibility で発見することが出来ました。

一方、データ形式によって発生する非互換な動作については、PHP Compatibility では見つけられないケースが多かったです。例えば、count 関数に countabe ではない型を渡す動作は PHP7.2 にて Warning として扱われるようになりましたが、これについては PHP Compatibilityで発見することは出来ませんでした。このような動作変更をチェックするためには count に渡される値の形を推定する必要があるのですが、PHP5.6 ではプリミティブな型の型宣言が出来ないなどの理由もあり、count に渡される値の型を自動的に判断することは無理なケースが多く、PHP Compatibility でも検出不可能でした。

このように、PHP Compatibility には得意不得意はあるので、PHP Compatibility だけでPHPのバージョンアップ対応は乗り切れません。ただ、PHP Compatibility による互換性のチェックは比較的低コストで行える割に必要な修正点もそれなりに見つけてくれますので、PHPバージョンアップ対応の最初の一歩として利用するのには良いのかなと思いました。

katsuraCompatibility, PHP, PHP5, PHP7, PhpStorm, 互換性

Posted by katsura