Текст, резюмированный ИИ durumis
- Было представлено средство миграции Rector для решения проблем устаревших синтаксических конструкций и версий после обновления PHP.
- Rector проверяет и исправляет синтаксис кода PHP от версии 5.3 до 8.2 под нужную версию.
- Для использования Rector требуются установка Composer, написание файла конфигурации rector.php, указание исключаемых правил и папок, а затем запуск.
Форум корейского CMS GNUboard5 обращался с жалобами на грамматику и версии, поддержка которых была прекращена после обновления версии php.
Так что я начал искать...
... и на reddit нашел инструмент под названием rector, который, как говорят, помогает в миграции. Представляю руководство по его использованию.
После выпуска PHP 7.0 в 2015 году появился инструмент для миграции php, например php cs-fixer, rector и т. д.
Думаю, rector немного удобнее в использовании.
Rector (произносится: ректор) проверяет и исправляет код PHP 5.3 ~ 8.2 в соответствии с нужной версией.
Жаль, что rector — это статический анализатор, поэтому он не обнаруживает ошибки, возникающие во время выполнения.
Для Rector требуется инструмент управления пакетами php Composer.
1. Установите Composer.
2. Установите rector в текущей папке проекта.
```php composer require rector/rector --dev
3. Создайте файл конфигурации rector.php .
Настройки rector.php
Для облегчения понимания зададим условия.
Предположим, что целевой исходный код — код php5.3, а целевая версия обновления — php 7.4.
Версия Rector — 1.0.3.
```php <?php
use Rector\Config\RectorConfig; use Rector\Php54\Rector\Array_\LongArrayToShortArrayRector; use Rector\Php74\Rector\LNumber\AddLiteralSeparatorToNumberRector;
return RectorConfig::configure() ->withPhpSets(php74: true) ->withParallel(1200, 8, 8) ->withPaths([ DIR . '/src', // Путь к исходному коду ]) ->withSkip([ Rector\Php73\Rector\ConstFetch\SensitiveConstantNameRector::class, Rector\Php74\Rector\LNumber\AddLiteralSeparatorToNumberRector::class, Rector\CodeQuality\Rector\If\SimplifyIfElseToTernaryRector::class, Rector\Php53\Rector\Ternary\TernaryToElvisRector::class, Rector\Php80\Rector\Class\ClassPropertyAssignToConstructorPromotionRector::class, Rector\Php80\Rector\FunctionLike\MixedTypeRector::class, Rector\CodeQuality\Rector\If\SimplifyIfNullableReturnRector::class, Rector\Php80\Rector\Switch\ChangeSwitchToMatchRector::class, Rector\Php74\Rector\Closure\ClosureToArrowFunctionRector::class, Rector\Php71\Rector\ClassConst\PublicConstantVisibilityRector::class, ]);
RectorConfig::config() задает папку с исходным кодом и версию PHP.
Функция withPhpSets задает функцию PHP, которую нужно обновить.
Если текущая версия php, где выполняется rector — php 8.0
```php ->withPhpSets(php74: true)
То есть, можно так: phpversion: true .
Но если работающая версия PHP ниже php 7.4
Поскольку в функции нельзя использовать именованный параметр, true нужно задавать перед тем, как появится нужная версия.
Rector поддерживает php 8.3, поэтому, чтобы указать версию php 74, нужно сделать вот так:
```php ->withPhpSets( false, // php 8.3 false, // php 8.2 false, // php 8.1 false, // php 8.0 false, // php 8.1 true // php 7.4 )
- >withPaths([
__DIR__ , // Это каталог, в котором расположена rector.php.
])
```php
->withSkip([
Rector\Php73\Rector\ConstFetch\SensitiveConstantNameRector::class,
Rector\Php74\Rector\LNumber\AddLiteralSeparatorToNumberRector::class,
Rector\CodeQuality\Rector\If\SimplifyIfElseToTernaryRector::class,
Rector\Php53\Rector\Ternary\TernaryToElvisRector::class,
Rector\Php80\Rector\Class\ClassPropertyAssignToConstructorPromotionRector::class,
'/data/*',
])
Укажите правила и папку, к которым не хотите применять функции.
Папка — это '/имя папки/*'
Файл — это 'имя файла'.
В качестве примера я добавил правило "SensitiveConstantNameRector" .
Rector не может найти неопределенный индекс в массиве PHP, распознавая его только как константу, поэтому он собирается неверно его поменять.
Поэтому я добавлю его в исключения.
```php
AddLiteralSeparatorToNumberRector //array -> []
SimplifyIfElseToTernaryRector
TernaryToElvisRector
ClassPropertyAssignToConstructorPromotionRector
Эти правила относятся к стилю кода, поэтому я исключил их.
Выполнение
Есть два варианта.
```bash vendor/bin/rector --dry-run --memory-limit=2G
Эта команда только выводит на консоль код, который нужно изменить.
Поскольку исходного кода может быть очень много, нужно указать оперативную