Tekst podsumowany przez sztuczną inteligencję durumis
- Przedstawiono narzędzie migracji Rector, które rozwiązuje problemy z nieobsługiwanymi składniami i problemami z wersjami po aktualizacji wersji PHP.
- Rector sprawdza i poprawia składnię kodu PHP od wersji 5.3 do 8.2 w celu dostosowania do wybranej wersji.
- Aby korzystać z Rectora, konieczna jest instalacja Composera, utworzenie pliku konfiguracyjnego rector.php, określenie reguł i folderów do pominięcia oraz uruchomienie narzędzia.
Po koreańskiej stronie o nazwie gnuboard5, poświęconej systemom CMS w PHP, zauważono kilka wpisów, w których użytkownicy skarżyli się na trudności związane z aktualizacją wersji PHP.
Zacząłem więc szukać rozwiązania i...
... trafiłem na reddita, gdzie dowiedziałem się o narzędziu o nazwie Rector, które ma pomóc w migracji. Oto krótki opis, jak z niego korzystać.
Od 2015 r., kiedy wydano PHP 7.0, pojawiają się różne narzędzia do migracji PHP, takie jak php cs-fixer, rector i inne.
Mam wrażenie, że rector jest nieco wygodniejszy w użyciu.
Rector (wym. rektor) sprawdza składnię kodu PHP w wersjach od 5.3 do 8.2 i naprawia błędy zgodnie z wybraną wersją.
Jedynym minusem jest to, że rector jest analizatorem statycznym, więc nie wykrywa błędów występujących podczas wykonywania.
Aby zainstalować Rector, należy mieć zainstalowany Composer (narzędzie do zarządzania pakietami PHP).
1. Zainstaluj Composera.
2. Zainstaluj Rector w bieżącym folderze projektu.
```php composer require rector/rector --dev
3. Utwórz plik konfiguracyjny rector.php.
Konfiguracja rector.php
Aby ułatwić zrozumienie, określamy kontekst.
Załóżmy, że kodem źródłowym docelowym jest kod PHP 5.3, a celem aktualizacji jest PHP 7.4.
Wersją Rectora jest 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', // Ścieżka do kodu źródłowego ]) ->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() ustawia folder kodu źródłowego i wersję PHP.
Funkcja withPhpSets ustawia funkcję PHP, do której ma zostać wykonana aktualizacja.
Jeśli wersja PHP, w której uruchamiany jest rector, to PHP 8.0:
```php ->withPhpSets(php74: true)
Można to zrobić tak: phpversion: true.
Jeśli jednak uruchamiana wersja PHP to PHP 7.4 lub niższa
Trzeba ustawić true, gdy pojawi się żądana wersja, ponieważ nie można użyć składni parametrów nazwanych w funkcji.
Ponieważ rector obsługuje PHP 8.3, aby określić PHP 74, należy zrobić to następująco:
```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__
, // To jest katalog, w którym znajduje się 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/*',
])
Określa reguły i foldery, których nie chcesz stosować.
Folder to '/nazwafolderu/*'
Plik to 'nazwapliku'
Dodałem regułę "SensitiveConstantNameRector" , ponieważ
rector nie znajduje niezdefiniowanego indeksu w tablicy PHP i rozpoznaje go tylko jako stałą, próbując go błędnie zmienić. Dlatego należy go dodać do wyjątków.
```php
AddLiteralSeparatorToNumberRector //array -> []
SimplifyIfElseToTernaryRector
TernaryToElvisRector
ClassPropertyAssignToConstructorPromotionRector
Te reguły są wyłączone, ponieważ są związane ze stylem kodu.