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

2020-12-28
phpphpstanastphp%20parser
    

目次

概要

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

    
s-yoshiki
s-yoshiki
githubtwitterqiita
Web作ってますが、インタラクティブなプログラミングも好きです。
JavaScript / Vue / node.js / PHP / AWS / OpenCV

関連記事

PHP-FPM(php7.4) Apache2.4 on Ubutnu20.04 Webサーバ構築
環境 パッケージの更新 Apache と PHP のインストール Apache のサービスを開始する PHPファイルを作成 参考にしたサイト Ubuntu20.04 に PHP7.4 + Apache2.4 をインストールしてWeb…

PHP-FPM(php7.4) Apache2.4 でWebサーバ構築 on CentOS8
環境 php7.4 のインストール apacheのインストール php-fpmの設定を変更する php-fpm の起動 apacheの起動 確認 おまけ: エラーと解決方法 "System has not been booted with systemd as…

CentOS8 に PHP7.4 インストール
環境 普通にインストールしようとするとphp7.2がインストールされる modularityについて php7.4 インストール CentOS8 に modularity を利用して PHP7.4をインストールした際のメモです。 環境 CentOS8.…

UNIXドメインソケット通信 vs INETドメインソケット通信 php-fpmで動作させる場合の違いについて
結論 ソケット通信について ソケットについて ソケット通信の種類 UNIXドメインソケット通信を行う場合のメリット 参考にしたサイト php-fpm の設定方法で調べた際にIPとポートで設定するパターンとUNIX…

PHP-Parser で PHP5からPHP7で動くコードに自動修正するツールが作る夢をみた
ツールが備える機能条件 PHP-Parser について PHP-Parser の簡単なサンプル ASTオブジェクトの置換・変更 PHP5からPHP7への変更内容を実装する ex1 includeパスを変更する ex2 例外クラスを Exception…

Amazon S3 と ローカルファイルのチェックサムの比較
s3apiでEtagを取得 検証 マルチアップロード時の注意点 Amazon S3 の Etagを使ってファイルの整合性チェックをする。 s3apiでEtagを取得 S3 APIを利用するとEtagを取得します。この値はmd5のハッシュ値になります。 検証 MD…

WordPressのDBから記事データを抽出する
WordPressのDB関連図 公開記事一覧の取得 タグ・カテゴリの取得 サムネイルの取得 おまけ: PHPスクリプト化しました 参考にしたところ WordPressにため込んだデータMarkdown化しGatsby…

PHPerkaigi 2020 資料まとめ
資料 もっと気軽にOSSに Pull Requestを出そう!/ Let's make a PR to OSS more easily PHP で JVM を実装して、 HelloWorld を出力してみる Deep Module in PHP 磯野ー、MySQL…

Ubuntu18.04にApache MariaDB PHP7.2 をセットアップ
環境情報 モジュール類の更新 Apacheのインストール PHP7.2のインストール インストール 動作確認 MariaDBのセットアップ MariaDBのインストール データベースと作業用ユーザの作成 参考 AWS の EC2 の Ubuntu18.0…

AWS S3のオブジェクト一覧をPHPで表示させる
S3アカウント サンプル AWS S3のオブジェクト一覧をPHPで表示させるサンプルコードの紹介. S3アカウント S3バケット参照用のユーザの作成方法は以下を参照してください。 https://tech-blog.s-yoshiki.com/2019/0…

最新の投稿

PHP-FPM(php7.4) Apache2.4 on Ubutnu20.04 Webサーバ構築
環境 パッケージの更新 Apache と PHP のインストール Apache のサービスを開始する PHPファイルを作成 参考にしたサイト Ubuntu20.04 に PHP7.4 + Apache2.4 をインストールしてWeb…

PHP-FPM(php7.4) Apache2.4 でWebサーバ構築 on CentOS8
環境 php7.4 のインストール apacheのインストール php-fpmの設定を変更する php-fpm の起動 apacheの起動 確認 おまけ: エラーと解決方法 "System has not been booted with systemd as…

CentOS8 に PHP7.4 インストール
環境 普通にインストールしようとするとphp7.2がインストールされる modularityについて php7.4 インストール CentOS8 に modularity を利用して PHP7.4をインストールした際のメモです。 環境 CentOS8.…

UNIXドメインソケット通信 vs INETドメインソケット通信 php-fpmで動作させる場合の違いについて
結論 ソケット通信について ソケットについて ソケット通信の種類 UNIXドメインソケット通信を行う場合のメリット 参考にしたサイト php-fpm の設定方法で調べた際にIPとポートで設定するパターンとUNIX…

Amplify CLI のインストール
Amplify CLI のインストール Amplify CLI の設定 バックエンド環境作成 Amplify CLI のインストールから設定まで Amplify CLI をインストール 設定 Amplify アプリを初期化 Amplify CLI…

AWS Amplify に Next.js (SSG) で作ったアプリをデプロイする
はじめに 操作 Next.js (React) アプリの作成、Gitへのプッシュ AWS Amplifyでプロジェクト作成 参考にしたサイト この記事では、React / Next.js アプリケーションを作成し、AWS Amplify…

Typescriptに入門した
初期作業 とりあえずHello World 初期作業 typescript環境を作っていきます。 とりあえずHello World まず、次のサンプルコードを作成します。 typescriptファイルをビルドします。

Vue/Nuxt.js 触ってた人が Next.js に入門する
はじめに 実施環境 学習ガイド Create a Next.js App Navigate Between Pages ページの作成 リンク Assets, Metadata, and CSS Assets メタデータ CSS…

PHP-Parser で PHP5からPHP7で動くコードに自動修正するツールが作る夢をみた
ツールが備える機能条件 PHP-Parser について PHP-Parser の簡単なサンプル ASTオブジェクトの置換・変更 PHP5からPHP7への変更内容を実装する ex1 includeパスを変更する ex2 例外クラスを Exception…

PHP5からPHP7への移行ツールを作るための解析・自動修正ツールを調べる
PHP5からPHP7への下位互換のない機能 使えそうなツールの洗い出し PHPStan phan php7cc php7mar php-to-7-aid Rector php-ast PHP-Parser まとめ 追記 (2021/01/0…

Tags

Dates

© 2021   404 motivation not found