PHP 8.1 komt eraan

Ingediend door Dirk Hornstra op 04-nov-2021 19:17

Bij één van de websites waar ik ondersteuning aan geef, gaf het CMS aan dat de gebruikte PHP-versie begin december niet meer ondersteund zou worden. Toen ik het control-panel in dook, heb ik deze bijgewerkt (hoogste 7.x versie), maar daar zag ik ook al een versie 8.1 staan.

Ik heb zelf een aantal omgevingen online staan, heb voor wat kennissen/vrienden ooit wat opgezet en ondersteun de website van ons dorp. Dat is bijna allemaal PHP, redelijk veel Wordpress, een Drupal, een Joomla, een Bolt en ook nog op wat plekken "eigen code". Een eigen framework om een agenda bij te kunnen houden, maar ook eigen plug-ins. Wat soms gebeurt is dat code/functies "deprecated" wordt, dus je krijgt een melding in beeld dat de functie later vervalt of een andere syntax krijgt. De quick-fix manier is om die meldingen te verbergen, alleen hou je dan jezelf voor de gek. Je moet die zaken alvast gaan fixen, zodat op het moment dat de PHP versie verhoogd wordt je niet tegen problemen aan gaat lopen.

Toevallig kwam ik in mijn mailbox een mailtje van Meetup tegen over... PHP 8.1. GroningenPHP had op 4 november een online bijeenkomst met de volgende omschrijving:

Talk by Ayesh Karunaratne.
PHP 8.1 will be released at the end of 2021, and it brings several major new features to PHP, such as Enums, Fibers, new types, final class constants, new PHP functions, AVIF image support, and a lot more.

Enums and Fibers opens up new possibilities with PHP. Enums brings PHP to many other programming languages that allows a wide range of
paradigms of more organized and type-checked code bases. Fibers, basic building blocks for concurrent code execution, opens up PHP to scope beyond the traditional web-server model.

Some changes such as with autovivification, implicit float to int conversation deprecation notices, and PHP built-in class return types can have a bigger impact on existing PHP applications, and will be talked about in depth as well.

## Audience
This talk is for intermediate/advanced PHP developers because it will be explaining the changes and new features in PHP. Experience with other strongly typed languages is not required, but will help catch up to speed with some features such as Enums.

## What you will learn.
- New features added in PHP 8.1
- Deprecated behaviors in PHP 8.1.
- Changes with bigger impact on Drupal core/plugins.
- How to test PHP applications on PHP 8.1 today, well before the official Generally-Available release date.

Laat ik voor de verandering eens een life-hack uitvoeren, niet zelf de documentatie induiken en samenvatten, maar een presentatie bekijken van iemand die het al uitgezocht heeft! Dus rond 19.45 uur ingelogd en rond 20.00 uur kon Ayesh zijn presentatie starten. In het eerste scherm deelde hij direct de locatie waar je de presentatie online kunt vinden, dus mocht je de presentatie gemist hebben, nog eens willen bekijken of na het lezen van dit bericht denken, dat wil ik lezen, hier kun je het nalezen: https://aye.sh/talk/php81-groningenphp

Ayesh komt uit Sri Lanka en naast zijn eigen site https://aye.sh/ beheer hij ook de site https://php.watch/ en de bijbehorende twitter-handles zijn @ayeshlive en @phpwch

Ayesh laat zien hoe de enums werken (die we in C# al een tijdje kennen), maar nu dus ook in PHP betere type-casting. Fibers waar je zaken "threaded" kunt doen, maar nu nog weinig nut hebben omdat er nu maar 1 proces loopt wat je met suspend() en resume() heen en weer kunt laten uitvoeren. Het "readonly" property, waardoor je variabelen 1x bij initialisatie kunt instellen (ook dit kennen we in C#). Intersection Types waarmee je bij parameters in een functie kunt aangeven dat ze bijvoorbeeld Iterator&Countable zijn (nog geen use-case voor gezien).

Het never-keyword, hiermee geef je aan dat je in de functie een exit of die() doet en de flow van je code dus stopt (function terminate() : never {...}).
De hash-functies xxHash en MurmurHash (die supersnel zijn, niet voor encryptie e.d. gebruikt moeten worden, maar bijvoorbeeld voor vergelijken van bestanden gebruikt kunnen worden). Tentative Return Types, als je in de interface een functie maakt met public function WaarOfNiet() : bool moet ook je class-implementatie bij die functie public function WaarOfNiet() : bool hebben. Voeg je die : bool niet toe, dan krijg je een error. Je kunt eventueel met een attribuut voor de functie dit wegdrukken: #[\ReturnTypeWillChange]

De $GLOBALS (die je eigenlijk niet zou moeten willen gebruiken) is alleen nog via $GLOBALS[$keynaam] te gebruiken.

De zaken die deprecated zijn, die lijst viel op zich wel mee. Ik denk dat je het beste de deprecated zaken van 8.0 en 8.1 kunt bekijken, die staan hier genoemd: https://php.watch/versions/8.0 en https://php.watch/versions/8.1

Maar goed, er zijn tools om je te helpen. Zo heb je de tool Rector (link) die je code om kan zetten. En wil je even een stuk PHP-code controleren? Dat kan met de online tool van 3v4l (link): jawel, leet-speak voor EVAL :D En zoals Ayesh ook al aangaf, je kunt een Docker container gebruiken: docker pull phpdaily/php:8.1-dev

Dus aan de slag. Hetzij met Docker, hetzij op de live-omgeving onder een subdomein een kopie opzetten en die omgeving "alvast" op PHP 8.0 of PHP 8.1 instellen en kijken wat er gebeurt. Je kunt daar ook de herstelacties doorvoeren en het overzetten naar je huidige live omgeving.