Rector でのPHP の書き換え
PHP のバージョンアップでは、数百から数千か所の書き換えが必要になることがあります。Rector を使うと、決まったルールに沿って、手作業の漏れなく一括で書き換えられます。
KEY SELECT は、Rector と PHPStan を導入し、ルールを選んで段階的に書き換え、差分をすべてレビューしてから取り込みます。
すべての作業を、セキュリティを意識して進めます。
Rector で書き換えられること
Rector は、PHP のコードを読み、ルールに当てはまる箇所を書き換えるオープンソースのツールです。PHP 5.3 の書き方から、PHP 8.5 と次の 8.6 の書き方まで、バージョンごとのルールを持っています。
削除された関数の置き換え
each()、create_function()、
新しい書き方への変換
switch をmatch に、
非推奨の書き方の修正
暗黙の${var} など、
型の追加
確実に
使われていないコードの削除
どこからも
フレームワークの移行
Symfony、
お引き受けできること
ツールに
Rector と PHPStan の導入
お使いの
ルールの選定
移行先の
段階的な書き換えとレビュー
ルールを
テストでの確認
Rector は
CI への組み込み
変更の
移行後の保守
次の
進め方
Rector の
準備
書き方の
決まりの ツールと PHPStan を 先に 入れ、 Rector が 型を 読み取れる 状態に します。 PHP の
バージョンの ルール PHP の
バージョンごとの ルールを 1 つずつ 足し、 今の バージョンまで 書き換えます。 品質の
ルール 型の
追加、 使われていない コードの 削除、 コードの 品質の ルールを、 安全な ものから 順に 足します。 レビューと
テスト 変更ごとに
差分を レビューし、 自動テストで 動きが 変わらない ことを 確かめて 取り込みます。 CI での
確認 変更の
たびに Rector の 検査を 動かし、 書き換えた 状態を 保ちます。
Rector では直せないこと
Rector は
結果だけが変わる変更
PHP 8.0 の
実行時に決まるもの
__get・__call を
書き方の整形
書き換えた
テンプレート
Twig、
技術者の方へ
Rector 2.7.0 (2026 年 10 月 6 日) の設定と使い方です。Rector 自体を動かすには PHP 7.4 以上が必要です (Composer のパッケージの条件。公式のドキュメントの一部には 7.2 以上と書かれています)。
入れ方と動かし方
# 開発用のパッケージとして入れる(初めて動かすと、rector.php を作るかを尋ねる)
composer require rector/rector --dev
# 書き換えずに、変わる箇所の差分だけを表示する
vendor/bin/rector process --dry-run
# 書き換える
vendor/bin/rector process
# CI: 書き換えるべき箇所が残っていると、終了コード 1 で失敗する
vendor/bin/rector process --dry-run --no-progress-bar --output-format=github
設定の例 (rector.php)
<?php
use Rector\Config\RectorConfig;
return RectorConfig::configure()
->withPaths([__DIR__ . '/src', __DIR__ . '/tests'])
// 引数を省くと、composer.json の PHP のバージョンまでのルールを使う
->withPhpSets()
// 型の追加、使われていないコードの削除、コードの品質のルールを、安全なものから N 個まで
->withTypeCoverageLevel(0)
->withDeadCodeLevel(0)
->withCodeQualityLevel(0);
withPhpSets()は、composer.jsonのrequire.phpの下限 (なければconfig.platform.php) のバージョンまでの、すべてのルールを使います。PHP 7.4 で動かす場合は、名前付き引数を使わないwithPhpLevel()を使います- 最初は
withPhpLevel(0)から始めて数字を 1 つずつ上げ、今のバージョンまでのルールがすべて入ったらwithPhpSets()に切り替えます - PHP 8.1 で非推奨になった「組み込みの関数に null を渡す」書き方を直す
NullToStrictStringFuncCallArgRectorと、#[\ReturnTypeWillChange]を付けるルールは、PHP のバージョンのセットに含まれていません。必要な場合はwithRules()で足します
PHP のバージョンごとのルールの例
| セット | ルールの | 書き換えの |
|---|---|---|
| PHP 7.0 | Php4ConstructorRector、EregToPregMatchRector | PHP 4 の__construct に、 |
| PHP 7.2 | CreateFunctionToAnonymousFunctionRector、ListEachRector | create_function() をeach() を |
| PHP 7.4 | CurlyToSquareBracketArrayStringRector | $str{0} を$str[0] に |
| PHP 8.0 | ChangeSwitchToMatchRector、StrContainsRector | switch をmatch に、strpos() !== false をstr_contains() に |
| PHP 8.2 | VariableInStringInterpolationFixerRector | 文字列の${var} を{$var} に |
| PHP 8.4 | ExplicitNullableParamTypeRector | 暗黙の?string の |
| PHP 8.5 | ShellExecFunctionCallOverBackticksRector | バッククォートをshell_exec() に |
フレームワークのルール
| 対象 | パッケージ | 開発元 |
|---|---|---|
| Symfony、Doctrine、PHPUnit | rector-symfony、rector-doctrine、rector-phpunit | Rector の |
| Laravel | driftingly/rector-laravel | Laravel の |
| CakePHP 3 系以降 | cakephp/upgrade | CakePHP の |
CakePHP 2 系は、
- 出典: Rector Documentation(Levels、Limitations、Run in CI)、Rector (GitHub)、Rector Laravel、cakephp/upgrade(2026 年 10 月 25 日に確認)
ご相談・ お問い合わせ
内容が