5 problemen en oplossingen bij onze PHP 8.1-upgrades

Afgelopen voorjaar hebben we een groot project gedaan waarbij we alle WordPress-websites die wij in beheer hebben succesvol over hebben gezet naar PHP 8.1. Bij het overzetten liepen we tegen een aantal issues aan, de oplossingen delen we graag met jullie. Een bekende uitdrukking luidt: zonder wrijving geen glans. Dat geldt ook zeer zeker voor ontwikkelingen in webdevelopment.

Eerder schreven we al een artikel over PHP 8.1 waarin we uitlegden wat PHP is en waarom een update nodig is.

Waarom proactief updaten naar PHP 8.1?

We wisten al vrij vroeg dat in november de levenscyclus van PHP-versie 7.4 tot een einde zou komen, een reguliere PHP-cyclus loopt immers twee jaar. We wilden proactief zijn en onze websites tijdig overhevelen. Waarom zou je daar mee wachten? Straks is er minder tijd om alle websites goed over te zetten, plus we kunnen alvast gebruik maken van de nieuwe functionaliteiten van de nieuwe versie.

Dit was voor ons een groot project, aangezien we bij elke website die wij in beheer hebben, de code hebben moeten aanpassen. We zijn hier met het gehele team meerdere weken mee beziggeweest. We wisten van te voren dat we hierbij tegen een aantal issues zouden aanlopen. Niks onoverkomelijk, dat is nou eenmaal hoe het in deze branche werkt. Uiteindelijk hebben we alles succesvol kunnen overzetten.

Issues tijdens onze PHP 8.1-upgrades?

Elke website heeft zijn eigen karakteristieken en unieke features. Een dergelijke upgrade heeft impact op externe plug-ins die draaien. In sommige gevallen zijn deze niet klaargestoomd voor een nieuwe PHP-versie.

We hebben een document bijgehouden waarin we de problemen hebben verzameld die wij zijn tegengekomen. We delen graag de vijf interessantste problemen met je. Dit zijn ze:

1. Create-functie in PHP 8.1

In PHP 8 is de create_function functie verwijderd. Deze functie kan gebruikt worden voor het dynamisch definiëren van een functie, maar werd binnen WordPress vaak gebruikt voor het aanmaken van een anonieme callback binnen een hook. Wat je bijvoorbeeld zou doen is:

add_action('wp_head', create_function("", "echo "Deze tekst staat bovenaan de pagina;"));

Omdat de create_function functie in de nieuwe PHP-versie dus niet meer bestaat moet deze code aangepast worden. Je kunt natuurlijk altijd een normale functie implementeren en de functienaam als string meegeven in de add_action call. Wil je nog steeds graag een anonieme functie gebruiken dan zou je bovenstaande code kunnen vervangen door:

add_action('wp_head', function() { echo "Deze tekst staat bovenaan de pagina"; });

2. Karakters binnen een string

In PHP was er de mogelijkheid om karakters binnen een string of items uit een array te halen door middel van het gebruik van accolades. Dus bijvoorbeeld:

$arr = [1, 2, 3];
echo $arr{1};</code

Deze optie is verwijderd in PHP 8. Gelukkig is de oplossing simpel: vervang de accolades door blokhaken ( dus: } -> ] ). Dit werkt voor zowel arrays als strings.

3. Volgorde van parameters

In oudere versies van PHP maakte de volgorde van parameters in functie-implementaties niet zo heel veel uit. In PHP 8 zijn er interessante functionaliteiten bij het implementeren van functies (zoals uitgebreidere type hints voor parameters) bijgekomen, daarnaast is het nu verplicht om optionele parameters als laatste parameter aan je functie mee te geven. Dit betekent dat dit:

function test($param1 = 'test', $param2) {}

niet meer werkt, dit moet aangepast worden naar:

function test($param2, $param1 = 'test') {}

4. strftime in PHP 8.1

Datum- en tijdweergave kan voor developers een uitdaging zijn. Om de datum/tijd weergave in de juiste tijdzone en lokalisatie te krijgen geeft nog wel eens problemen. Een functie die daarvoor vaak van pas kwam is de strftime functie. Deze houdt rekening met de huidige lokalisatie binnen je project.

In PHP 8.1 is deze functie deprecated (en in PHP 9 zal hij ook daadwerkelijk verwijderd worden). PHP-developers geven aan dat deze vervangen moet worden door de IntlDateFormatter class. Je zou dus bijvoorbeeld onderstaande kunnen gebruiken, maar andere oplossingen zijn ook mogelijk:

$formatter = new IntlDateFormatter('nl_NL', IntlDateFormatter::LONG, IntlDateFormatter::NONE);
$formatter->setPattern('dd-MM-Y');
$dateTime = new DateTime("2022-08-31");
echo $formatter->format($dateTime);

5. Autoloaders

In WordPress-thema’s zul je dit misschien niet zo vaak tegenkomen, maar als je vaak met PHP-classes werkt kan een autoloader je veel tijd schelen, omdat je niet elke class handmatig in je code moet zetten. In PHP 8 is de __autoload functie niet meer beschikbaar. Deze functie kon je gebruiken voor het automatisch laden van classes.

In PHP 8 is deze functie vervangen door spl_autoload_register. Hiermee kun je automatisch classes inladen zodra de eerste instantie van de class aangeroepen wordt. Via een anonieme functie zou je bijvoorbeeld onderstaande kunnen doen:

spl_autoload_register(function ($class) {
include 'classes/' . $class . '.class.php';
});

Doe er je voordeel mee

Dit waren vijf issues waar wij tegenaan zijn gelopen tijdens onze PHP-upgrades.

PHP 8.2 staat alweer bijna voor de deur en zal op 24 november uitkomen. Eind november zal PHP 8.0 geen actieve ondersteuning meer krijgen, er zullen enkel en alleen nog veiligheidslekken worden gedicht.

(huidige ondersteunde PHP-versies)


Gerelateerde artikelen


  • Algemeen
  • Internetstrategie

Eigen software op maat: software laten ontwikkelen

Toe aan de volgende stap met je onderneming? Kunnen bedrijfsprocessen beter geoptimaliseerd worden, maar heb je de kennis niet in huis? Overweeg dan om software op maat te laten maken. We leggen je graag uit waarom je eigen software laten ontwikkelen een goed idee kan zijn.

  • Algemeen
  • Interview
  • Nieuwe medewerker