🛠️

PHPのバージョンを上げるためにやってきたこと

2022/02/01に公開

はじめに

これまで何回かPHPのバージョンを上げるお仕事をしてきましたので、
その際にやってきたことを書いておこうと思います。

PHPマニュアルを調べる

PHPはマニュアルにバージョンを上げるためのページが用意されているので、
1つ1つ順番に見ていき、影響箇所は順番に修正することになります。

下記はPHP8.0の移行ガイドになります。
主に見るのは、下位互換のない変更推奨されなくなる機能あたりになるかと思います。
https://www.php.net/manual/ja/migration80.php

昨年PHP8.1が出たので、こちらも最近はよく見ていますね。
https://www.php.net/manual/ja/migration81.php

Composerパッケージの対応しているPHPバージョンを調べる

おそらく何かしらのパッケージをComposerを使って入れていると思うので、そのパッケージが上げるPHPのバージョンに対応しているのか、いま使っているパッケージのバージョンでも動くのかを調べます。

メンテナンスが止まっているようなパッケージだと、非推奨な関数などを使っている場合もあるので、別パッケージを使うように対応するか、そのパッケージを自らメンテナンスするなどを行う必要があります。

また、上げようとしているバージョン向けの修正が入っている場合は、最低限その修正が含まれているバージョンまで上げる必要が出てきます。

拡張モジュールを調べる

PECLのサイトから使っている拡張モジュールを探して、上げようとしているPHPのバージョンに対応しているのか調べます。
https://pecl.php.net/

静的解析ツールを使う

PHPマニュアルを淡々と見るのには限界があるので、次に下記のような静的解析ツールを使います。
なお、使い方などはそれぞれのREADMEを見てください。

PHPCompatibility

https://github.com/PHPCompatibility/PHPCompatibility

PHPCompatibilityはPHP CodeSniffer(phpcs)のルールセットで、PHPのバージョン間の互換性をチェックするためのツールになります。
全ての非互換性の部分を見つけてくれるわけではないですが、影響箇所をある程度見つけてくると思います。

PHP-CS-Fixer

https://github.com/FriendsOfPHP/PHP-CS-Fixer

PHP-CS-Fixerはコードを自動整形してくれるツールですが、ルールセットの中にはPHPマイグレーションのルールもあるので、利用すれば、ある程度は自動で修正を行うことが可能になるかと思います

こちらのディレクトリのPHPXXMigrationが該当します。(XXはPHPバージョンです)
https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/master/doc/ruleSets

Rector

https://github.com/rectorphp/rector

RectorはPHPやフレームワークなどのバージョンアップ作業で定型的なコードを自動修正してくれるツールになります。

こちらのファイルのPhpXXが修正可能なルールになります。(XXはPHPバージョンです)
https://github.com/rectorphp/rector/blob/v0.8.8/docs/rector_rules_overview.md?plain=1#L47-L57

PHP-CS-Fixerと自動修正は被ってきますが、対応しているルールが異なる点と独自のルールも定義できたりするので、プロジェクトにあったルールを作成して対応することも可能です。

ユニットテストを使う

ここまでやっても、見つからないものは必ずありますので、そういう時はPHPUnitを使ってユニットテストを実行です。

ある程度の条件網羅したテストコードがあれば、静的解析ツールでは見つけれない内容も見つけることができると思います。

そもそもテストコードが上げるバージョン次第では動かない可能性もあるので、先にテストコードの修正も必要かもしれないです。
(これは実際に起きると思います。)

そのためにもバージョンを上げる前にテストコードをたくさん書く必要があります。
一応コードカバレッジを最低でも80%ほどあると気持ちに余裕が出ると思います。

ただし、例えカバレッジが80%以上あったとしても、条件の網羅性が不足している場合もあると思います。
それだとあまり意味はないかもしれないので、ここで出した数字はあくまで目安くらいと考えておきとよいかもしれないです。

手動でテストを行う

プロダクト次第では色々な事情でテストコードがなかったりするので、そんな時は手動でテスト実施になります。
普段通りにプロダクトを触ると、ユニットテストでは網羅できていないパターンがあるかもしれないからです。
なので、最後は人の手に頼るのが一番です。

ネット上の記事を読む

これはおまけな感じなんですが、
バージョンアップを行うとその時に得た知見がブログや登壇時のスライドなどがネット上にたくさんあったりします。
その中にはマニュアルに書いてないようなことを解決した内容もあったりするので、探して読んでみるもの良いかと思います。

修正したコードは事前に出す

ビッグバンリリースは避けましょう!!

現在使っているバージョンで修正可能なものは事前に修正し、さっさとリリースしておきましょう!!

これはリリースまで全てのコードを保持しておくと、機能改修や不具合修正で触ったコードが被ってコンフリクトが起きたりするのを回避するためでもあります。

まとめ

ここまでPHPのバージョンを上げるためにやっていることをつらつら書いてきました。
今まで、やってきたことを文章化する機会もなかったので、改めて書くと色々とやってきたんだなーって思っています。

ほかにもやり方はあると思いますが、この内容が誰かの参考になればうれしい限りです!

Discussion