PHP5からPHP7への移行ツールを作るための解析・自動修正ツールを調べる

PHP5からPHP7への移行ツールを作るための解析・自動修正ツールを調べる

2020-12-283 min read

目次

  1. 概要
  2. php5からphp7への下位互換のない機能
  3. 使えそうなツールの洗い出し
  4. まとめ
  5. 追記-20210102
  6. 参考にしたサイト

概要

PHP5で書かれたコードをPHP7環境で動作させるために、使えそうなツールを調べた際の記録です。

最終的にはこれらのツールを組み合わせたりカスタマイズするなりして、PHP5にしか対応しないコードをPHP7環境で動かすことができるコードに再生成するための "夢のような" システムを作ることを目標としますが、まずはそのための調査を行います。

システムの目標はあくまでもPHP5コードをPHP7で無理矢理にでも動かすコードを生成することであって、リファクタリングするとか最適化することは考えません。あくまで動作(やけくそ)させることが目的です。

PHP5からPHP7への下位互換のない機能

下位互換性のない変更点 (PHP 5.6.x から PHP 7.0.x への移行) https://www.php.net/manual/ja/migration70.incompatible.php

PHP7では大幅な機能追加やパフォーマンス向上といった対応が行われましたが、それと同時に下位互換性のない変更も行われました。当然ながらPHP5にしか対応していないコードはPHP7用にの対応を行って行く必要があります。

使えそうなツールの洗い出し

まずは使えそうなツールを洗い出してみました。

PHPStan

PHPStan についてはこちらで分かりやすく説明しています。

PHPStanは、PHP静的解析ツールの大御所です。composerなどのautoloadファイルを解釈し、一部のコードを実行することで解析の高速化を実現しています。静的解析ですが、PHPを一部実行します。実行環境は、PHP7.1以上です。

Komiyama Taki. "5千ファイル超のレガシープロジェクトにPHPStan継続的静的解析を導入". note. 2020-06-30. https://note.com/komi_yama/n/ncfe9a73ce374, (2020-12-28)

phan

phanPHPStan と同様に静的解析を行うツールです。メンテナンスも行われています。 PHPStan とどちらが良いかとう議論をしばしば目にしました。

php7cc

php7cc は PHP7 との互換性をチェックするツールです。しかし残念ながら最後のコミットが数年前であり、メンテナンスが止まっているようです。

php7mar

php7mar PHP7との互換性の観点では既存のPHP 5コードに関するレポートを生成するコマンドラインツールです。こちらもコミットが数年前で止まっているという状況です。リポジトリ自体もArchivedとなっております。

php-to-7-aid

php-to-7-aid も下位互換のチェックを行うツールですが、メンテナンスは止まっています。

Rector

Rector は既存のPHPコードのリファクタリングやアップグレードを自動実行するツールです。

Rector は上記の静的解析ツールとは異なり、PHP-CS-Fixer(=コード整形を行うツール)コード修正の自動実行を行うことが特徴です。

使用感についてはこちらに記載されていたものを引用します。

まだまだ発展途上という感じですが、裏側の仕組みをみると PHP-CS-Fixerと比べて柔軟なことができそうな予感がしたのでまた時間を見つけて触ってみようと思います。

fortkle. "PHPアプリケーションのアップグレードとリファクタリングを楽にするrectorphp/rectorを試す". fortkle blog. 2018-12-16. https://fortkle.hatenablog.com/entry/2018/12/16/235830

自前の独自変換ルールなどの追加も行えますが、autoloadを利用していることが前提です。

php-ast

php-ast はPHPコードをAST(=抽象構文木)に分解するphpの拡張モジュールです。上で触れたphanphp-ast に依存しています。

こちらのスライドで詳しく解説しています。

ASTに分解した後のコードの再生性が難しそうなため使うことは見送りますが、なかなか面白いことができそうです。

PHP-Parser

PHP-Parserphp-astと同様にPHPで実装されたPHPコードからASTを構築するパーサです。 PHP-ParserRectorPHPStan でも利用されています。

まとめ

静的解析(構文のチェック)では PHPStan なんかが利用できそうでした。 コードの自動修正となると、RectorPHP-Parser が利用できそうでした。

ただし Rector は autoload を利用していることが前提になるなど制約があります。

追記 (2021/01/02)

PHP-Parserを利用して自動で置換する方法を考えてみました。

PHP-Parser で PHP5からPHP7で動くコードに自動修正するツールを作る夢をみた

参考にしたサイト

PHP5.6からPHP7.2へアップデート時の互換性チェックツール、ハマった体験談へのリンク https://qiita.com/suin/items/db7a9bc3b11039346977

下位互換性のない変更点 (PHP 5.6.x から PHP 7.0.x への移行) https://www.php.net/manual/ja/migration70.incompatible.php

Tags
javascript(110)
node.js(54)
linux(54)
amazon%20aws(47)
typescript(45)
%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0(36)
%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86(30)
html5(29)
php(24)
centos(24)
python(22)
%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0(21)
mac(21)
mysql(20)
canvas(19)
opencv(17)
%E9%9B%91%E8%AB%87(16)
docker(16)
wordpress(15)
atcoder(14)
apache(12)
%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92(12)
%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9(12)
amazon%20s3(12)
red%20hat(12)
prisma(12)
ubuntu(11)
github(10)
git(10)
vue.js(10)
%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86100%E6%9C%AC%E3%83%8E%E3%83%83%E3%82%AF(10)
mariadb(10)
react(9)
aws%20cdk(9)
css3(8)
%E5%8F%AF%E8%A6%96%E5%8C%96(8)
%E5%B0%8F%E3%83%8D%E3%82%BF(8)
nestjs(8)
amazon%20lightsail(7)
next.js(7)
%E3%83%96%E3%83%AD%E3%82%B0(6)
cms(6)
oracle(6)
perl(6)
gitlab(6)
iam(5)
amazon%20ec2(5)
%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93(5)
aws%20amplify(5)
curl(4)
Author
githubzennqiita
ただの備忘録です。

※外部送信に関する公表事項