♻️ WordPress 6.4와 플러그인 디렉터리를 위한 PHP 호환성 극대화
WordPress 6.4 「Shirley」가 출시되었습니다. PHP 8.1 또는 8.2에서 실행하는 것이 권장되지만, 지원되는 최소 PHP 버전은 여전히 7.0입니다.
따라서 WordPress 플러그인은 (가능한 한) PHP 7.0까지 지원하고, PHP 8.1 및 8.2와도 호환되어야 합니다.
가장 논리적인 방법은 PHP 7.0으로 플러그인을 개발하면서 다음 사항을 준수하는 것입니다.
- PHP 7.x에서 더 이상 사용되지 않는 기능은 사용하지 않기 (PHP 8.x에서 제거되었으므로)
- PHP 8.x에서 더 이상 사용되지 않는 기능은 사용하지 않기 (경고가 발생하므로)
플러그인 코드의 호환성을 확인하려면 다양한 PHP 버전이 실행되는 여러 환경에서 철저하게 테스트해야 합니다.
PHP 7.x로 개발하는 것에는 명확한 단점이 있습니다. 플러그인 코드는 PHP 8.x와 호환되어야 하지만, union types, match 표현식, nullsafe 연산자 등 PHP 8.x의 기능을 전혀 사용할 수 없습니다.
더 나은 대안이 있습니다.
PHP 코드를 8.x에서 7.x로 다운그레이드하기
PHP 7로 개발하여 PHP 8에서 동작하도록 확인하는 대신, 반대의 방법을 취할 수 있습니다. 즉, 플러그인을 PHP 8로 개발하고 PHP 7로 다운그레이드하는 것입니다.
이것은 Rector 덕분에 가능합니다. Rector는 PHP 코드 리팩토링을 자동화하는 도구입니다.
Rector는 PHP 8.1에서 PHP 7.2로 코드를 다운그레이드하는 규칙을 제공합니다. 이를 통해 이러한 최신 기능들을 WordPress 플러그인에서 사용하고 PHP 7.2 코드로 다운그레이드할 수 있습니다.
예를 들어, DowngradeMatchToSwitchRector 규칙은 match 연산자를 switch 연산자로 변환합니다.
class SomeClass
{
public function run()
{
- $message = match ($statusCode) {
- 200, 300 => null,
- 400 => 'not found',
- default => 'unknown status code',
- };
+ switch ($statusCode) {
+ case 200:
+ case 300:
+ $message = null;
+ break;
+ case 400:
+ $message = 'not found';
+ break;
+ default:
+ $message = 'unknown status code';
+ break;
+ }
}
}이러한 규칙들은 PHP 7.2까지의 다운그레이드를 지원하며, PHP 7.1이나 7.0까지는 커버하지 않는다는 점을 주의하세요. 하지만 이 두 PHP 버전을 합쳐도 WordPress 사이트의 3%에 불과하므로 큰 문제는 아닙니다.
코드 다운그레이드는 더 나은 접근 방식입니다. 그 이유는 다음과 같습니다.
- PHP 8.1로 개발함으로써 코드가 PHP 8.1 및 8.2와 호환됨을 확실히 보장할 수 있습니다.
- 다운그레이드 규칙이 존재하는 PHP 기능을 사용하는 한, 코드는 PHP 7.2, 7.3, 7.4에서도 동작합니다.
- union types, match 표현식, nullsafe 연산자 등 PHP 8.x의 기능을 활용할 수 있습니다.
단, 모든 PHP 8.x 기능을 사용할 수 있는 것은 아닙니다. 예를 들어, enumeration을 다운그레이드하는 규칙은 (아직) 존재하지 않으므로 사용할 수 없습니다.
테스트에 관해서는 차이가 없습니다. 안전을 위해 다양한 PHP 버전이 실행되는 여러 환경에서 플러그인을 철저하게 테스트해야 합니다.
코드 다운그레이드 방법
Gato GraphQL은 PHP 8.1로 개발되고, 프로덕션 환경을 위해 PHP 7.2로 다운그레이드됩니다.
코드 다운그레이드와 테스트, 그리고 프로덕션 환경으로의 플러그인 릴리스는 모두 GitHub Actions 워크플로를 통해 자동화되어 있습니다.
downgrade_php_tests.yml: 코드를 다운그레이드하고 PHP 7.2로 분석하기generate_plugins.yml: 릴리스용 플러그인을 생성하고 PHP 7.2로 다운그레이드하기integration_tests.yml: 새로 생성된 플러그인을 다양한 PHP 버전이 실행되는 여러 InstaWP 인스턴스에 설치하고 통합 테스트 실행하기
자세한 내용은 이 주제에 관해 작성한 몇 가지 글을 참고하시기 바랍니다.
- 🦸🏿♂️ Gato GraphQL is now transpiled from PHP 8.0 to 7.1
- Transpiling PHP code from 8.0 to 7.x via Rector
- Coding in PHP 7.4 and deploying to 7.1 via Rector and GitHub Actions
도움이 되셨으면 좋겠습니다 🙏