♻️ Maximiser la compatibilité PHP pour WordPress 6.4 et le répertoire d'extensions
WordPress 6.4 « Shirley » a été publié. Il est recommandé de l'exécuter avec PHP 8.1 ou 8.2, mais la version PHP minimale prise en charge reste 7.0.
Ainsi, nos extensions WordPress doivent (autant que possible) prendre en charge PHP jusqu'à 7.0, et être compatibles avec PHP 8.1 et 8.2.
La façon la plus logique de procéder est de coder nos extensions en utilisant PHP 7.0, tout en :
- N'utilisant aucune fonctionnalité qui a été dépréciée dans PHP 7.x, car celles-ci auront été supprimées dans PHP 8.x
- N'utilisant aucune fonctionnalité qui a été dépréciée dans PHP 8.x, car celles-ci généreront des avertissements
Pour être sûr que le code de l'extension est compatible, nous devons le tester minutieusement dans plusieurs environnements, exécutant les différentes versions de PHP.
Coder en PHP 7.x présente un inconvénient clair : Le code de l'extension doit être compatible avec PHP 8.x, mais il ne peut utiliser aucune de ses fonctionnalités, telles que les union types, l'expression match, l'opérateur nullsafe, et bien d'autres.
Il existe une meilleure alternative.
Rétrograde du code PHP de 8.x vers 7.x
Au lieu de coder en PHP 7 et de s'assurer que cela fonctionne avec PHP 8, nous pouvons faire l'inverse : Coder l'extension en PHP 8, et la rétrograder vers PHP 7.
C'est possible grâce à Rector, un outil pour automatiser le refactoring du code PHP.
Rector fournit des règles pour rétrograder le code de PHP 8.1 vers PHP 7.2. Cela signifie que nous pouvons utiliser ces fonctionnalités modernes dans nos extensions WordPress, car elles peuvent être rétrogradées en code PHP 7.2.
Par exemple, la règle DowngradeMatchToSwitchRector convertit l'opérateur match en un opérateur 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;
+ }
}
}Notez que les règles ne servent qu'à rétrograder jusqu'à PHP 7.2, pas jusqu'à PHP 7.1 et 7.0. Cependant, ce n'est pas un gros problème, car ces deux versions de PHP combinées ne représentent que 3 % des sites WordPress.
Rétrograder le code est une meilleure approche, parce que :
- En codant en PHP 8.1, nous sommes absolument certains que notre code sera compatible avec PHP 8.1 et 8.2.
- Tant que nous utilisons des fonctionnalités PHP pour lesquelles il existe des règles de rétrogradation, le code fonctionnera également en PHP 7.2, 7.3 et 7.4.
- Nous pouvons utiliser les fonctionnalités de PHP 8.x, telles que les union types, l'expression match, l'opérateur nullsafe, et bien d'autres.
Notez que toutes les fonctionnalités de PHP 8.x ne sont pas disponibles. Par exemple, il n'existe pas de règle (encore) pour rétrograder les énumérations, nous ne pouvons donc pas les utiliser.
Concernant les tests, il n'y a pas de différence : Nous devons également tester minutieusement l'extension dans plusieurs environnements, exécutant les différentes versions de PHP, pour être du côté sûr.
Comment rétrograder le code
Gato GraphQL est développé avec PHP 8.1, et rétrogradé vers PHP 7.2 pour la production.
La rétrogradation du code et son test, puis la publication de l'extension pour la production, sont entièrement automatisés via des workflows GitHub Actions :
downgrade_php_tests.yml: Rétrograde le code et l'analyse en utilisant PHP 7.2generate_plugins.yml: Génère l'extension pour la publication, en la rétrogradant vers PHP 7.2integration_tests.yml: Installe l'extension nouvellement générée dans un ensemble d'instances InstaWP exécutant différentes versions de PHP, et exécute des tests d'intégration
Pour en savoir plus, j'ai écrit quelques articles sur ce sujet :
- 🦸🏿♂️ Gato GraphQL est désormais transpilé de PHP 8.0 vers 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
J'espère que vous le trouverez utile 🙏