Blog

♻️ PHP-compatibiliteit maximaliseren voor WordPress 6.4 en de pluginmap

Leonardo Losoviz
Door Leonardo Losoviz ·

WordPress 6.4 "Shirley" is uitgebracht. Het wordt aanbevolen om het te gebruiken met PHP 8.1 of 8.2, maar de minimaal ondersteunde PHP-versie is nog steeds 7.0.

Daarom moeten onze WordPress-plugins (zo veel mogelijk) PHP ondersteunen tot en met versie 7.0, en compatibel zijn met PHP 8.1 en 8.2.

De meest logische manier om dat te doen is onze plugins te schrijven in PHP 7.0, terwijl je:

  • Geen functies gebruikt die zijn afgeschaft in PHP 7.x, want die zijn verwijderd in PHP 8.x
  • Geen functies gebruikt die zijn afgeschaft in PHP 8.x, want die zullen waarschuwingen geven

Om zeker te zijn dat de plugincode compatibel is, moeten we die grondig testen in verschillende omgevingen met de verschillende PHP-versies.

Coderen in PHP 7.x heeft een duidelijk nadeel: de plugincode moet compatibel zijn met PHP 8.x, maar kan geen gebruik maken van functies zoals union types, de match-expressie, de nullsafe-operator en nog veel meer.

Er is een beter alternatief.

PHP-code downgraden van 8.x naar 7.x

In plaats van te coderen in PHP 7 en te zorgen dat het werkt met PHP 8, kunnen we het omgekeerde doen: de plugin schrijven in PHP 8 en downgraden naar PHP 7.

Dit is mogelijk dankzij Rector, een tool om PHP-code automatisch te refactoren.

Rector biedt regels om code te downgraden van PHP 8.1 naar PHP 7.2. Dit betekent dat we deze moderne functies kunnen gebruiken in onze WordPress-plugins, omdat ze omgezet kunnen worden naar PHP 7.2-code.

Zo converteert de regel DowngradeMatchToSwitchRector de match-operator naar een switch-operator:

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;
+        }
    }
}

Merk op dat de regels alleen geschikt zijn voor downgraden naar PHP 7.2, niet helemaal tot PHP 7.1 en 7.0. Dit is echter geen groot probleem, want deze twee PHP-versies samen zijn goed voor slechts 3% van de WordPress-sites.

Code downgraden is een betere aanpak, omdat:

  • Door te coderen in PHP 8.1 weten we zeker dat onze code compatibel is met PHP 8.1 en 8.2.
  • Zolang we PHP-functies gebruiken waarvoor downgrade-regels bestaan, werkt de code ook in PHP 7.2, 7.3 en 7.4.
  • We kunnen gebruik maken van PHP 8.x-functies zoals union types, de match-expressie, de nullsafe-operator en nog veel meer.

Let op dat niet alle PHP 8.x-functies beschikbaar zijn. Er is bijvoorbeeld (nog) geen regel om enumeraties te downgraden, dus die kunnen we niet gebruiken.

Wat testen betreft is er geen verschil: we moeten de plugin ook grondig testen in verschillende omgevingen met de verschillende PHP-versies, om aan de veilige kant te blijven.

Hoe code te downgraden

Gato GraphQL is ontwikkeld met PHP 8.1 en wordt gedowngraded naar PHP 7.2 voor productie.

Het downgraden van de code, het testen ervan en het vervolgens uitbrengen van de plugin voor productie is volledig geautomatiseerd via GitHub Actions-workflows:

Meer hierover kun je lezen in een aantal artikelen die ik over dit onderwerp heb geschreven:

Ik hoop dat je er wat aan hebt 🙏


Abonneer je op onze nieuwsbrief

Blijf op de hoogte van alle updates over Gato GraphQL.