前回の記事ではRectorを使ってプロジェクト内の古い記法を書き換える手順を紹介しました。書き換えたい記法が1つの場合は前回の解説で十分だと思いますが、例えば、PHPのアップグレードに合わせて新たに導入された記法をまとめて適用したい、という場合は Set Lists を使うのがオススメです。今回はそちらの手順を紹介します。

Set Lists

セットリストはいくつかのルールをトピック別にグループ化したものです。
例えば設定ファイルを以下の様に書き換えると、PHP8.0で導入された記法をまとめて適用することができます。

<?php

declare(strict_types=1);

use Rector\Config\RectorConfig;
use Rector\Set\ValueObject\SetList;

return static function (RectorConfig $rectorConfig): void {

    // app 配下のみを対象にする
    $rectorConfig->paths([
        __DIR__ . '/app',
    ]);

    // PHP8.0で導入された変更を適用する
    $rectorConfig->sets([SetList::PHP_80]);
};

指定可能なセットリストは以下です。

https://github.com/rectorphp/rector/blob/main/packages/Set/ValueObject/SetList.php

PHPバージョン別に導入された記法であったり、コーディングスタイルであったり、デッドコードであったり、
色々ありますね。

各セットリストで適用される変更はRules OverviewのCategoriesから確認できます。

Level Sets

PHPのバージョンアップ用にLevel Set Listというセットリストも用意されています。
これは、指定したバージョン以前のruleもまとめて適用したい場合に使えます。
例えば、前項のサンプルコードの様に、

$rectorConfig->sets([SetList::PHP_80]);

とした場合はPHP8.0のruleのみ適用されますが、PHP7.2, 7.3, 7.4 のruleもまとめて適用したい場合は

$rectorConfig->sets([LevelSetList::UP_TO_PHP_80]);

とすれば変更に含まれます。

一部のruleを無視する

ruleをまとめて適用できるセットリストは便利ですが、
プロジェクトによってはセットリストに含まれる1部のruleを除外したいケースがあるかもしれません。
その場合は以下の様にskip()を使って除外したいruleを指定します。

例えば、以下のように変更するとswitch文をmatch文に変更するルールが無視されます。

<?php

declare(strict_types=1);

use Rector\Config\RectorConfig;
use Rector\Set\ValueObject\LevelSetList;
use Rector\Php80\Rector\Switch_\ChangeSwitchToMatchRector;

return static function (RectorConfig $rectorConfig): void {

    // app 配下のみを対象にする
    $rectorConfig->paths([
        __DIR__ . '/app',
    ]);

    // PHP8.0で導入された変更を適用する
    $rectorConfig->sets([LevelSetList::UP_TO_PHP_80]);

    // switch -> match への変更を無視する
    $rectorConfig->skip([
        ChangeSwitchToMatchRector::class,
    ]);
};

まとめ

いかがでしたでしょうか。

普段PHPのバージョンを上げる際は廃止される記法の書き換えはmustで行いますが、
新しい記法の導入には慎重になりがちです。

その理由の1つに、書き換えた結果どれ位コードが良くなるか分からないから、というのがあります。

しかし、Rectorを活用することで取り敢えず書き換えてみる、
その上で取り入れるかどうか検討してみる、といった事もできそうです。

参照

Rectorでリファクタリングを自動化 その1
Rectorでリファクタリングを自動化 その3

メルマガ購読の申し込みはこちらから。

By hikaru