{"id":32012,"date":"2020-05-27T23:57:06","date_gmt":"2020-05-28T06:57:06","guid":{"rendered":"https:\/\/kinsta.com\/?p=73118"},"modified":"2023-08-16T12:17:41","modified_gmt":"2023-08-16T10:17:41","slug":"php-8","status":"publish","type":"post","link":"https:\/\/kinsta.com\/nl\/blog\/php-8\/","title":{"rendered":"Wat nieuw is in PHP 8 (functies, verbeteringen en de JIT Compiler)"},"content":{"rendered":"<p>PHP 8 is officieel uitgebracht voor &#8220;General Availability&#8221; op 26 november 2020!<\/p>\n<p>Deze nieuwe grote update bevat een hele reeks optimalisaties en krachtige features en we zijn verheugd om je door de meest interessante veranderingen te loodsen waarmee we beter kunnen coderen en krachtigere applicaties kunnen schrijven.<\/p>\n<figure id=\"attachment_84636\" aria-describedby=\"caption-attachment-84636\" style=\"width: 399px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-84636\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2020\/05\/php-8-released.png\" alt=\"PHP 8 released\" width=\"399\" height=\"270\"><figcaption id=\"caption-attachment-84636\" class=\"wp-caption-text\"><a href=\"https:\/\/www.php.net\/releases\/8.0\/en.php\">PHP 8.0 Announcement Addendum<\/a><\/figcaption><\/figure>\n<p>Ben je er klaar voor? Aan de slag!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2 id=\"jit\">PHP JIT (Just in Time Compiler)<\/h2>\n<p>De feature van PHP 8 waar de meeste mensen naar uitkijken is de <strong>Just-in-Time (JIT) compiler<\/strong>. Maar wat is JIT precies?<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/jit\" target=\"_blank\" rel=\"noopener noreferrer\">Het RFC voorstel<\/a> beschrijft JIT als volgt:<\/p>\n<blockquote><p>&#8220;PHP JIT is ge\u00efmplementeerd als een zo goed als onafhankelijk onderdeel van OPcache. Het kan voor de compileertijd en voor de looptijd van PHP worden ingeschakeld\/uitschakeld. Wanneer het is ingeschakeld, wordt de native code van PHP data in een extra regio van OPcache Shared Memory opgeslagen en zorgen op_array\u2192opcodes[].handler(s) voor verwijzigen naar de toegangspunten van ge-JIT-eerde code.&#8221;<\/p><\/blockquote>\n<p>Maar hoe zijn we bij JIT aanbeland en wat is het verschil tussen JIT en OPcache?<\/p>\n<p>Laten we, om de rol van JIT binnen PHP beter te begrijpen, eens kijken hoe <a href=\"https:\/\/kinsta.com\/nl\/blog\/wat-is-php\/\" target=\"_blank\" rel=\"noopener noreferrer\">PHP<\/a> zaken uitvoert: vanaf de broncode tot het uiteindelijke resultaat.<\/p>\n<p>De PHP uitvoering is een proces in 4 fasen:<\/p>\n<ul>\n<li><strong>Lexing\/Tokenisering<\/strong>: ten eerste leest de interpreter de PHP code en bouwt een set tokens.<\/li>\n<li><strong>Parsing<\/strong>: de interpreter controleert of het script voldoet aan de syntaxregels en gebruikt tokens om een <a href=\"https:\/\/en.wikipedia.org\/wiki\/Abstract_syntax_tree\" target=\"_blank\" rel=\"noopener noreferrer\">Abstract Syntax Tree<\/a> (AST) te maken, wat een <a href=\"https:\/\/wiki.php.net\/rfc\/abstract_syntax_tree\" target=\"_blank\" rel=\"noopener noreferrer\">hi\u00ebrarchische weergave is van de structuur van de broncode<\/a>.<\/li>\n<li><strong>Compilatie<\/strong>: de interpreter doorloopt de tree en vertaalt de AST knooppunten in low-level Zend opcodes. Dit zijn numerieke identificatoren die het type <a href=\"https:\/\/nikic.github.io\/2017\/04\/14\/PHP-7-Virtual-machine.html\" target=\"_blank\" rel=\"noopener noreferrer\">instructie bepalen dat door de Zend VM wordt uitgevoerd<\/a>.<\/li>\n<li><strong>Interpretatie<\/strong>: Opcodes worden ge\u00efnterpreteerd en uitgevoerd op de Zend VM.<\/li>\n<\/ul>\n<p>De volgende afbeelding toont een visuele weergave van het standaard PHP uitvoerproces.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/php-uitvoeringsproces.png\" alt=\"Standaard PHP uitvoeringsproces\" width=\"1100\" height=\"1460\"><figcaption class=\"wp-caption-text\">Standaard PHP uitvoeringsproces<\/figcaption><\/figure>\n<p>Maar hoe maakt OPcache PHP nu sneller? En wat verandert er met JIT precies aan dit uitvoeringsproces?<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>De OPcache extensie<\/h3>\n<p>PHP is een ge\u00efnterpreteerde taal. Dit betekent dat, wanneer een PHP script wordt uitgevoerd, de interpreter deze parsed (ontleedt), compileert en uitvoert. Dit gebeurt bij elk nieuw verzoek opnieuw en opnieuw. Het nadeel hiervan laat zich raden: de kans is groot dat je hierdoor tijd en <a href=\"https:\/\/phptherightway.com\/#opcode_cache\" target=\"_blank\" rel=\"noopener noreferrer\">CPU resources verspilt<\/a>.<\/p>\n<p>Dit is waar de <a href=\"https:\/\/www.php.net\/manual\/en\/intro.opcache.php\" target=\"_blank\" rel=\"noopener noreferrer\">OPcache extensie<\/a> van pas komt:<\/p>\n<blockquote><p>&#8220;Opcache verbetert de prestaties van PHP door een voorgecompileerde script-bytecode in het Shared Memory op te slaan. Hierdoor vervalt voor PHP de noodzaak om bij elk verzoek scripts te laden en te parsen.&#8221;<\/p><\/blockquote>\n<p>Met OPcache ingeschakeld doorloopt de PHP interpreter het bovengenoemde proces van 4 stappen alleen wanneer het script voor de eerste keer wordt uitgevoerd. Omdat PHP bytecodes in het Shared Memory worden opgeslagen, zijn ze meteen beschikbaar als een low-level intermediate representation en kunnen ze meteen op de Zend VM worden uitgevoerd.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/php-uitvoeringsproces -2.png\" alt=\"Het PHP uitvoeringsproces met OPcache ingeschakeld\" width=\"1100\" height=\"1560\"><figcaption class=\"wp-caption-text\">Het PHP uitvoeringsproces met OPcache ingeschakeld<\/figcaption><\/figure>\n<p>Vanaf PHP 5.5 is de Zend OPcache extensie standaard beschikbaar. Je kan makkelijk controleren of je deze correct hebt geconfigureerd door <a href=\"https:\/\/kinsta.com\/blog\/phpinfo\/\" target=\"_blank\" rel=\"noopener noreferrer\"><code>phpinfo()<\/code> aan te roepen<\/a> vanuit een script op je server of door je php.ini bestand te checken (zie <a href=\"https:\/\/www.php.net\/manual\/en\/opcache.configuration.php\">OPcache configuratie-instellingen<\/a>).<\/p>\n<p>Leessuggestie: <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-geheugenlimiet\/\">Zo verhoog je de PHP geheugenlimiet in WordPress<\/a>.<\/p>\n<figure style=\"width: 1926px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/zend-opcache.jpg\" alt=\"Zend Opcache sectie in een phpinfo pagina\" width=\"1926\" height=\"992\"><figcaption class=\"wp-caption-text\">Zend Opcache sectie in een phpinfo() pagina<\/figcaption><\/figure>\n<h3>Preloading<\/h3>\n<p>OPcache is onlangs verbeterd met de toevoeging van <a href=\"https:\/\/wiki.php.net\/rfc\/preload\" target=\"_blank\" rel=\"noopener noreferrer\">preloading<\/a>, een nieuwe OPcache function die is toegevoegd in <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-7-4\/\" target=\"_blank\" rel=\"noopener noreferrer\">PHP 7.4<\/a>. Preloading biedt een manier om een opgegeven set scripts op te slaan in het OPcache geheugen &#8220;<em>voordat welke applicatiecode dan ook wordt uitgevoerd<\/em>&#8220;, maar brengt geen significante verbeteringen voor typische webgebaseerde applicaties.<\/p>\n<p>Je kan meer lezen over preloading in <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-7-4\/#preloading\" target=\"_blank\" rel=\"noopener noreferrer\">onze inleiding tot PHP 7.4<\/a>.<\/p>\n<p>Met JIT zet PHP een stap vooruit..<\/p>\n<h3>JIT \u2014 The Just in Time Compiler<\/h3>\n<p>Zelfs als opcodes de vorm hebben van intermediate representations, moeten ze nog steeds worden gecompileerd in machinecode. JIT &#8220;introduceert geen aanvullend IR (Intermediate Representation) formulier&#8221;, maar gebruikt <a href=\"https:\/\/luajit.org\/dynasm.html\" target=\"_blank\" rel=\"noopener noreferrer\">DynASM<\/a> (Dynamic Assembler voor codegeneratie-engines) om uit PHP byte-code rechtstreeks native code te genereren.<\/p>\n<p>Kortom, <strong>JIT vertaalt de &#8220;hete delen&#8221; van de intermediate code in machinecode<\/strong>. Door het compilatieproces over te slaan, zou het aanzienlijke verbeteringen in prestaties en geheugenverbruik kunnen betekenen.<\/p>\n<p>Zeev Surasky, co-auteur van het PHP JIT voorstel, laat hoeveel sneller berekeningen zouden zijn met JIT:<\/p>\n<p><kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=dWH65pmnsrI\"><\/kinsta-video><\/p>\n<p>Maar zou JIT ook de <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-prestaties\/\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress prestaties<\/a> effectief kunnen verbeteren?<\/p>\n<h3>JIT voor Live Web Apps<\/h3>\n<p>Volgens de JIT RFC zou de implementatie van de Just-in-Time Compiler de prestaties van PHP moeten verbeteren. Maar zouden we dergelijke verbeteringen ook daadwerkelijk ervaren binnen real-life apps als WordPress?<\/p>\n<p>De eerste tests tonen inderdaad aan dat JIT CPU intensieve workloads aanzienlijk versnelt, <a href=\"https:\/\/wiki.php.net\/rfc\/jit#performance\" target=\"_blank\" rel=\"noopener noreferrer\">maar de RFC waarschuwt<\/a>:<\/p>\n<blockquote><p>&#8220;&#8230; net als de vorige pogingen &#8211; het lijkt er momenteel niet op dat het significante verbeteringen brengt aan real-life apps als WordPress (met opcache.jit=1235 326 req\/sec vs 315 req\/sec).<\/p>\n<p>Het is de bedoeling dat we hiermee nog verder aan de slag gaan, om JIT te verbeteren voor real-life apps met behulp van profiling en speculatieve optimalisaties.&#8221;<\/p><\/blockquote>\n<p>Wanneer JIT is ingeschakeld, wordt de code niet uitgevoerd door Zend VM, maar door de CPU zelf. Dit zou de berekeningssnelheid moeten verbeteren. Web apps als <a href=\"https:\/\/kinsta.com\/nl\/blog\/wat-is-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress<\/a> zijn ook afhankelijk van andere factoren als <a href=\"https:\/\/kinsta.com\/nl\/blog\/ttfb\/\" target=\"_blank\" rel=\"noopener noreferrer\">TTFB<\/a>, <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-database-problemen-oplossen\/\" target=\"_blank\" rel=\"noopener noreferrer\">database-optimalisatie<\/a>, <a href=\"https:\/\/kinsta.com\/nl\/leren\/wat-is-http\/\" target=\"_blank\" rel=\"noopener noreferrer\">HTTP verzoeken<\/a>, etc.<\/p>\n<figure id=\"attachment_84635\" aria-describedby=\"caption-attachment-84635\" style=\"width: 1884px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-84635 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2020\/05\/php-8-performance-diagram.png\" alt=\"Relatieve bijdrage JIT aan performance PHP 8\" width=\"1884\" height=\"1206\"><figcaption id=\"caption-attachment-84635\" class=\"wp-caption-text\">Relatieve bijdrage JIT aan performance PHP 8 (bron: <a href=\"https:\/\/www.php.net\/releases\/8.0\/en.php\">PHP 8.0 Announcement Addendum<\/a>)<\/figcaption><\/figure>\n<p>We hoeven dus geen significante verbetering te verwachten in de snelheid waarmee PHP wordt uitgevoerd als het gaat om WordPress en vergelijkbare apps. Toch kan JIT, met name voor <a href=\"https:\/\/kinsta.com\/nl\/blog\/salaris-van-webdevelopers\/\" target=\"_blank\" rel=\"noopener noreferrer\">ontwikkelaars<\/a>, verschillende voordelen met zich meebrengen.<\/p>\n<p><a href=\"https:\/\/externals.io\/message\/103903#103927\" target=\"_blank\" rel=\"noopener noreferrer\">Volgens Nikita Popov<\/a>:<\/p>\n<blockquote><p>&#8220;De voordelen van de JIT Compiler zijn grofweg (en zoals al beschreven in de RFC):<\/p>\n<ul>\n<li>Significant betere prestaties voor numerieke code.<\/li>\n<li>Iets betere prestaties voor &#8220;typische&#8221; PHP webapplicatiecode.<\/li>\n<li>De potentie om meer code van C naar PHP te verplaatsen, omdat PHP nu snel genoeg zal zijn.&#8221;<\/li>\n<\/ul>\n<\/blockquote>\n<p>Dus hoewel JIT nauwelijks noemenswaardige verbeteringen zal brengen wat betreft WordPress prestaties, tilt het wel PHP naar het volgende niveau, waarmee het een taal wordt waar veel functions nu rechtstreeks in kunnen worden geschreven.<\/p>\n<p>Het nadeel is wel dat de grotere complexiteit kan leiden tot hogere kosten voor <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-onderhoud\/\" target=\"_blank\" rel=\"noopener noreferrer\">onderhoud<\/a>, stabiliteit en <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-debugging\/\" target=\"_blank\" rel=\"noopener noreferrer\">debugging<\/a>. Volgens Mitry Stogov:<\/p>\n<blockquote><p>&#8220;JIT is uiterst eenvoudig, maar het verhoogt wel het complexiteitsniveau van PHP als geheel, met een verhoogd risico op nieuwe soorten bugs en een hogere kosten voor ontwikkeling en onderhoud.&#8221;<\/p><\/blockquote>\n<p>Het voorstel om JIT op te nemen in PHP 8 werd aangenomen met 50 stemmen voor en 2 stemmen tegen.<\/p>\n\n<h2>Verbeteringen en nieuwe functions PHP 8<\/h2>\n<p>Naast JIT kunnen we veel andere functions en verbeteringen verwachten met PHP 8. De volgende lijst is een zorgvuldig samengestelde selectie van de aankomende toevoegingen en wijzigingen die PHP betrouwbaarder en effici\u00ebnter moeten gaan maken.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"17\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3 id=\"constructor-property-promotion\">Constructor Property Promotion<\/h3>\n<p>Als gevolg van een voortdurende discussie over hoe we <a href=\"https:\/\/hive.blog\/php\/@crell\/improving-php-s-object-ergonomics\">object ergonomics in PHP<\/a> kunnen verbeteren, stelt de <a href=\"https:\/\/wiki.php.net\/rfc\/constructor_promotion\">Constructor Property Promotion RFC<\/a> een nieuwe en beknoptere syntax voor die de property declaration simplificeert, waardoor deze korter en zinvoller wordt.<\/p>\n<p>Dit voorstel heeft alleen betrekking op <strong>promoted parameters<\/strong>, dwz de method parameters met de visibility keywords <strong>public<\/strong>, <strong>protected<\/strong> en <strong>private<\/strong> als prefix.<\/p>\n<p>Momenteel moeten alle property&#8217;s meerdere keren herhaald worden (minimaal vier keer) voordat we ze met objects kunnen gebruiken. Kijk eens naar het volgende voorbeeld uit de RFC:<\/p>\n<pre><code class=\"language-php\">class Point {\n    public int $x;\n    public int $y;\n    public int $z;\n\n    public function __construct(\n        int $x = 0,\n        int $y = 0,\n        int $z = 0,\n    ) {\n        $this-&gt;x = $x;\n        $this-&gt;y = $y;\n        $this-&gt;z = $z;\n    }\n}<\/code><\/pre>\n<p>Volgens Nikita Popov, de bedenker van de RFC, moeten we de property name minstens vier keer op drie verschillende plaatsen neerzetten: de property declaration, de constructor parameters en de property assignment. Deze syntax is niet erg bruikbaar, vooral niet in classes met een groot aantal property&#8217;s en meer beschrijvende namen.<\/p>\n<p>Deze RFC stelt voor om de constructor en de parameter definition samen te voegen. Vanaf PHP 8 gaan we dus beschikken we dus over een meer bruikbare manier om parameters te declareren en kan je de bovenstaande code veranderen in wat je hieronder ziet:<\/p>\n<pre><code class=\"language-php\">class Point {\n    public function __construct(\n        public int $x = 0,\n        public int $y = 0,\n        public int $z = 0,\n    ) {}\n}<\/code><\/pre>\n<p>En dat was het al. We hebben dus de beschikking over een nieuwe manier om property&#8217;s te promoten: korter, beter leesbaar en minder foutgevoelig. <a href=\"https:\/\/phpinternals.news\/53\">Volgens Nikita<\/a>:<\/p>\n<blockquote><p>Het is een kleine syntactische transformatie die we hier voorstellen. Maar het vermindert wel de hoeveelheid code die je moet schrijven voor met name value objects&#8230;<\/p><\/blockquote>\n<p>De property declaration wordt getransformeerd aangezien we deze property&#8217;s al expliciet hebben gedeclared. We kunnen de <a href=\"https:\/\/www.php.net\/manual\/en\/intro.reflection.php\">Reflection API<\/a> gebruiken om de property definitions v\u00f3\u00f3r de uitvoering te introspecten (zie <a href=\"https:\/\/wiki.php.net\/rfc\/constructor_promotion#desugaring\">Sesugaring<\/a>):<\/p>\n<blockquote><p>Reflection (en andere andere introspectionmechanismen) observeren de state na desugaring. Dit betekent dat de promoted property&#8217;s er hetzelfde uitzien als expliciet gedeclarede property&#8217;s en promoted constructor arguments verschijnen dus als ordinary constructor arguments.<\/p><\/blockquote>\n<pre><code class=\"language-php\">\/\/ before desugaring\nclass Point {\n    public function __construct(public int $x = 0) {}\n}\n\n\/\/ after desugaring\nclass Point {\n    public int $x;\n\n    public function __construct(int $x = 0) {\n        $this-&gt;x = $x;\n    }\n}<\/code><\/pre>\n<h4>Inheritance<\/h4>\n<p>We hebben geen beperkingen opgesteld bij het gebruik van inheritance in combinatie met promoted parameters. Hoe dan ook, er is specifieke relatie tussen constructors van parent en child class. <a href=\"https:\/\/phpinternals.news\/53\">Volgens Nikita<\/a>:<\/p>\n<blockquote><p>Meestal zeggen we dat methoden altijd compatibel moeten zijn met de bovenliggende methode. [&#8230;] maar deze regel is niet van toepassing op de constructor. De constructor behoort dus echt tot een single class en constructors tussen parent en child class hoeven op geen enkele manier compatibel te zijn.<\/p><\/blockquote>\n<p>Dit is een voorbeeld:<\/p>\n<pre><code class=\"language-php\">class Test {\n    public function __construct(\n        public int $x = 0\n    ) {}\n}\n\nclass Child extends Test {\n    public function __construct(\n        $x, \n        public int $y = 0,\n        public int $z = 0,\n    ) {\n        parent::__construct($x);\n    }\n}<\/code><\/pre>\n<h4>Wat niet toegestaan is bij promoted property&#8217;s<\/h4>\n<p>Promoted property&#8217;s zijn toegestaand in non-abstract constructors en traits, maar er zijn een aantal beperkingen die het vermelden waard zijn.<\/p>\n<h5>Abstract constructors<\/h5>\n<p>Promoted property&#8217;s zijn niet toegestaan in abstract classes en interfaces:<\/p>\n<pre><code class=\"language-php\">abstract class Test {\n    \/\/ Error: Abstract constructor.\n    abstract public function __construct(private $x);\n}\n \ninterface Test {\n    \/\/ Error: Abstract constructor.\n    public function __construct(private $x);\n}<\/code><\/pre>\n<h5>Nullability<\/h5>\n<p>Een van de meest opvallende beperkingen houdt verband met nullability. Eerder, wanneer we een type gebruikten dat niet expliciet nullabel was, maar die wel een null als default value had, dan was het type impliciet nullabel. Maar met property types hebben we dit impliciete gedrag niet, omdat promoted parameters een property declaration vereisen. Het nullable type moet dus expliciet gedeclared worden. Bekijk het onderstaande voorbeeld van de RFC:<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: Using null default on non-nullable property\n    public function __construct(public Type $prop = null) {}\n\n    \/\/ Correct: Make the type explicitly nullable instead\n    public function __construct(public ?Type $prop = null) {}\n}<\/code><\/pre>\n<h5>Callable Type<\/h5>\n<p>Aangezien &#8220;callable&#8221; geen <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-7-4\/#typed-properties\">property type is dat wordt ondersteund<\/a>, mogen we geen callable type gebruiken in promoted property&#8217;s:<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: Callable type not supported for properties.\n    public function __construct(public callable $callback) {}\n}<\/code><\/pre>\n<h5>The var Keyword Is Not Allowed<\/h5>\n<p>Alleen een visibility keyword kan worden gebruikt met promoted parameters, dus het declaren van constructor property&#8217;s met het <code>var<\/code> keyword is niet toegestaan (zie het onderstaande voorbeeld van de RFC):<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: \"var\" keyword is not supported.\n    public function __construct(var $prop) {}\n}<\/code><\/pre>\n<h5>No Duplications Allowed<\/h5>\n<p>We kunnen promoted property&#8217;s en explicit property&#8217;s combineren binnen dezelfde class, maar property&#8217;s kunnen niet twee keer worden gedeclared:<\/p>\n<pre><code class=\"language-php\">class Test {\n    public string $prop;\n    public int $explicitProp;\n\n    \/\/ Correct\n    public function __construct(public int $promotedProp, int $arg) {\n        $this-&gt;explicitProp = $arg;\n    }\n\n    \/\/ Error: Redeclaration of property.\n    public function __construct(public string $prop) {}\n}<\/code><\/pre>\n<h5>Variadic Parameters Are Not Allowed<\/h5>\n<p>De reden is dat het declared type verschilt van de variadic parameters, wat eigenlijk een array is:<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: Variadic parameter.\n    public function __construct(public string ...$strings) {}\n}<\/code><\/pre>\n<h4>Verder lezen<\/h4>\n<p>Als je meer wil weten over Constructor Property Promoted, luister dan naar dit <a href=\"https:\/\/phpinternals.news\/53\">interview met Nikita Popov<\/a>. Voor een uitgebreid overzicht van object ergonomics in PHP, zie <a href=\"https:\/\/hive.blog\/php\/@crell\/improving-php-s-object-ergonomics\">dit artikel<\/a> en het volgende <a href=\"https:\/\/phpinternals.news\/51\">interview met Larry Garfield<\/a>.<\/p>\n<h3 id=\"abstract-trait-methods\">Validatie voor abstract trait methods<\/h3>\n<p><a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.traits.php\" target=\"_blank\" rel=\"noopener noreferrer\">Traits<\/a> worden gedefinieerd als &#8220;een mechanisme voor hergebruik van code in single-inheritance talen als PHP&#8221;. Normaal gesproken worden ze gebruikt om methods vast te leggen die in meerdere classes kunnen worden gebruikt.<\/p>\n<p>Een trait kan ook abstract methods bevatten. Deze methods leggen alleen de signature van de method vast, de implementatie van de method moet binnen de class worden gedaan met behulp van de trait.<\/p>\n<p>Volgens de <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.traits.php#language.oop5.traits.abstract\" target=\"_blank\" rel=\"noopener noreferrer\">PHP handleiding<\/a>,<\/p>\n<blockquote><p>&#8220;Traits ondersteunen het gebruik van abstract methods om eisen te stellen aan de exhibiting class.&#8221;<\/p><\/blockquote>\n<p>Dit betekent ook dat de signatures van de methods overeen moeten komen. Met andere woorden, het type en het aantal vereiste arguments <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener noreferrer\">moeten hetzelfde zijn<\/a>.<\/p>\n<p>Hoe dan ook, volgens de auteur van de RFC, <a href=\"https:\/\/externals.io\/message\/108065#108164\" target=\"_blank\" rel=\"noopener noreferrer\">Nikita Popov<\/a>, wordt de signature-validatie momenteel alleen sporadisch afgedwongen:<\/p>\n<ul>\n<li>In de meeste gevallen wordt het niet afgedwongen wanneer de method implementatie wordt geleverd door de using class: <a href=\"https:\/\/3v4l.org\/SeVK3\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/3v4l.org\/SeVK3<\/a><\/li>\n<li>Het wordt afgedwongen als de implementatie afkomstig is van een parent class: <a href=\"https:\/\/3v4l.org\/4VCIp\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/3v4l.org\/4VCIp<\/a><\/li>\n<li>Het wordt afgedwongen als de implementatie afkomstig is van een child class: <a href=\"https:\/\/3v4l.org\/q7Bq2\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/3v4l.org\/q7Bq2<\/a><\/li>\n<\/ul>\n<p>Het volgende voorbeeld van Nikia heeft betrekking op het eerste geval (de niet-afgedwongen signature):<\/p>\n<pre><code class=\"language-php\">trait T {\n\tabstract public function test(int $x);\n}\n \nclass C {\n\tuse T;\n\n\t\/\/ Allowed, but shouldn't be due to invalid type.\n\tpublic function test(string $x) {}\n}<\/code><\/pre>\n<p>Dat gezegd hebbende, <a href=\"https:\/\/wiki.php.net\/rfc\/abstract_trait_method_validation\" target=\"_blank\" rel=\"noopener noreferrer\">deze RFC<\/a> stelt voor om altijd een fatal error te geven wanneer de implementing method niet compatibel is met de abstract trait method, ongeacht de oorsprong:<\/p>\n<pre><code>Fatal error: Declaration of C::test(string $x) must be compatible with T::test(int $x) in \/path\/to\/your\/test.php on line 10<\/code><\/pre>\n<p>Deze RFC is unaniem goedgekeurd.<\/p>\n<h3 id=\"incompatible-method-signatures\">Incompatibele method signatures<\/h3>\n<p>In PHP veroorzaken inheritance errors als gevolg van incompatibele method signatures een fatal error of een waarschuwing, afhankelijk van wat de fout veroorzaakt.<\/p>\n<p>Als een class een interface implementeert, dan veroorzaken incompatibele method signatures een fatal error. Volgens de <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.interfaces.php\" target=\"_blank\" rel=\"noopener noreferrer\">Oject Interfaces documentatie<\/a>:<\/p>\n<blockquote><p>&#8220;De class die de interface implementeert moet een method signature gebruiken die compatibel is met LSP (Liskov Substitution Principle). Als je dit niet doet, krijg je een fatal error.&#8221;<\/p><\/blockquote>\n<p>Dit is een voorbeeld van een <a href=\"https:\/\/wiki.php.net\/rfc\/lsp_errors\" target=\"_blank\" rel=\"noopener noreferrer\">inheritance error met een interface<\/a>:<\/p>\n<pre><code class=\"language-php\">interface I {\n\tpublic function method(array $a);\n}\nclass C implements I {\n\tpublic function method(int $a) {}\n}<\/code><\/pre>\n<p>In PHP 7.4 zou de bovenstaande code de volgende error opleveren:<\/p>\n<pre><code>Fatal error: Declaration of C::method(int $a) must be compatible with I::method(array $a) in \/path\/to\/your\/test.php on line 7<\/code><\/pre>\n<p>Een function in een child class met een incompatible signature zou een error geven. Bekijk de volgende code van de RFC:<\/p>\n<pre><code class=\"language-php\">class C1 {\n\tpublic function method(array $a) {}\n}\nclass C2 extends C1 {\n\tpublic function method(int $a) {}\n}<\/code><\/pre>\n<p>In PHP 7.4 zou de bovenstaande code alleen een waarschuwing geven:<\/p>\n<pre><code>Warning: Declaration of C2::method(int $a) should be compatible with C1::method(array $a) in \/path\/to\/your\/test.php on line 7<\/code><\/pre>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/lsp_errors\" target=\"_blank\" rel=\"noopener noreferrer\">Deze RFC<\/a> gaat een stapje verder en stelt voor om een fatal error te genereren voor incompatibele method signatures. Met PHP 8 zou de code die we eerder zagen het volgende oproepen:<\/p>\n<pre><code>Fatal error: Declaration of C2::method(int $a) must be compatible with C1::method(array $a) in \/path\/to\/your\/test.php on line 7<\/code><\/pre>\n<h3 id=\"negative-array-index\">Arrays beginnend met een negatieve index<\/h3>\n<p>Als een array in PHP begint met een negatieve index (<code>start_index &lt;0<\/code>), dan beginnen de indices erna vanaf 0 (meer hierover in <a href=\"https:\/\/www.php.net\/manual\/en\/function.array-fill.php\" target=\"_blank\" rel=\"noopener noreferrer\">array_fill documentatie<\/a>). Dit wordt toegelicht in het volgende voorbeeld:<\/p>\n<pre><code class=\"language-php\">$a = array_fill(-5, 4, true);\nvar_dump($a);<\/code><\/pre>\n<p>In PHP 7.4 zou dit resulteren in het volgende:<\/p>\n<pre><code>array(4) {\n\t[-5]=&gt;\n\tbool(true)\n\t[0]=&gt;\n\tbool(true)\n\t[1]=&gt;\n\tbool(true)\n\t[2]=&gt;\n\tbool(true)\n}<\/code><\/pre>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/negative_array_index\" target=\"_blank\" rel=\"noopener noreferrer\">Deze RFC<\/a> stelt hierin een wijziging voor, zodat de tweede index <code>start_index +1<\/code> zou zijn, ongeacht de value van <code>start_index<\/code>.<\/p>\n<p>In PHP zou bovenstaande code dus resulteren in de volgende array:<\/p>\n<pre><code>array(4) {\n\t[-5]=&gt;\n\tbool(true)\n\t[-4]=&gt;\n\tbool(true)\n\t[-3]=&gt;\n\tbool(true)\n\t[-2]=&gt;\n\tbool(true)\n}<\/code><\/pre>\n<p>Met PHP vertonen arrays die beginnen met een negatieve index dus ander gedrag. Lees meer over backward incompatibilities in <a href=\"https:\/\/wiki.php.net\/rfc\/negative_array_index#backward_incompatible_changes\" target=\"_blank\" rel=\"noopener noreferrer\">de RFC<\/a> zelf.<\/p>\n<h3 id=\"union-types-2-0\">Union types 2.0<\/h3>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Union_type\" target=\"_blank\" rel=\"noopener noreferrer\">Untion types<\/a> accepteren values die van verschillende types kunnen zijn. Momenteel biedt PHP geen ondersteuning voor union types, met uitzondering van de <code>?Type<\/code> syntax en special type <code>iterable<\/code>.<\/p>\n<p>Voor PHP 8 konden union types alleen worden gespecificeerd in phpdoc annotations, zoals je kan zien in het onderstaande voorbeeld van de RFC:<\/p>\n<pre><code class=\"language-php\">class Number {\n\t\/**\n\t * @var int|float $number\n\t *\/\n\tprivate $number;\n\n\t\/**\n\t * @param int|float $number\n\t *\/\n\tpublic function setNumber($number) {\n\t\t$this-&gt;number = $number;\n\t}\n\n\t\/**\n\t * @return int|float\n\t *\/\n\tpublic function getNumber() {\n\t\treturn $this-&gt;number;\n\t}\n}<\/code><\/pre>\n<p>De <a href=\"https:\/\/wiki.php.net\/rfc\/union_types_v2\" target=\"_blank\" rel=\"noopener noreferrer\">RFC Union Types 2.0<\/a> stelt voor om ondersteuning voor union types toe te voegen in function signatures, zodat we niet meer afhankelijk zijn van inline documentatie, maar nu union types kunnen defini\u00ebren met een <code>T1|T2|<\/code>&#8230; syntax:<\/p>\n<pre><code class=\"language-php\">class Number {\n\tprivate int|float $number;\n\n\tpublic function setNumber(int|float $number): void {\n\t\t$this-&gt;number = $number;\n\t}\n\n\tpublic function getNumber(): int|float {\n\t\treturn $this-&gt;number;\n\t}\n}<\/code><\/pre>\n<p>Dit wordt uitgelegd door Nikita Popov in de RFC,<\/p>\n<p>&#8220;Door in de taal union types te ondersteunen kunnen we meer type information verplaatsen van phpdoc naar function signatures, met de gebruikelijke voordelen die dit met zich meebrengt:<\/p>\n<ul>\n<li>Types worden daadwerkelijk afgedwongen, dus fouten kunnen vroegtijdig worden opgemerkt.<\/li>\n<li>Omdat ze worden afgedwongen, is het minder waarschijnlijk dat type information verouderd raakt of edge-cases mist.<\/li>\n<li>Types worden tijdens inheritance al gecontroleerd, waardoor het Liskov Substitution Principle kan worden gehandhaafd.<\/li>\n<li>Types zijn beschikbaar via Reflection.<\/li>\n<li>De syntax is veel minder boilerplate-erig dan phpdoc.&#8221;<\/li>\n<\/ul>\n<p>Union types ondersteunen alle beschikbare types, met enkele beperkingen:<\/p>\n<ul>\n<li>Het <code>void<\/code> type kan geen deel uitmaken van een union, omdat <code>void<\/code> inhoudt dat een function <a href=\"https:\/\/wiki.php.net\/rfc\/void_return_type\">geen enkele value retourneert<\/a>.<\/li>\n<li>Het <code>null<\/code> type wordt uitsluitend ondersteund in union types, maar gebruik ervan als een standalone type is niet toegestaan.<\/li>\n<li>De nullable type notation (<code>?T<\/code>) is ook toegestaan, wat <code>T|null<\/code> Het is echter niet toegestaan om de ?T notatie op te nemen in union types (<code>?T1|T2<\/code> is niet toegestaan en we moeten dus in plaats daarvan <code>T1|T2|null<\/code> gebruiken).<\/li>\n<li>Aangezien veel functions (dwz. <code>strpos()<\/code>, <code>strstr()<\/code>, <code>substr()<\/code> false bevatten als mogelijke return types, wordt het pseudo-type false ook ondersteund.<\/li>\n<\/ul>\n<p>Je kan in het RFC meer lezen over <a href=\"https:\/\/wiki.php.net\/rfc\/union_types_v2\" target=\"_blank\" rel=\"noopener noreferrer\">Union Types V2<\/a>..<\/p>\n<h3 id=\"type-errors-internal-functions\">Consistent type errors voor internal functions<\/h3>\n<p>Wanneer een parameter van een illegaal type wordt doorgegeven, gedragen <a href=\"https:\/\/www.php.net\/manual\/en\/functions.internal.php\" target=\"_blank\" rel=\"noopener noreferrer\">internal<\/a> en <a href=\"https:\/\/www.php.net\/manual\/en\/functions.user-defined.php\">user-define<\/a> functions zich anders.<\/p>\n<p>User-defined functions veroorzaken een <code>TypeError<\/code>, maar internal functions gedragen zich op verschillende manieren, afhankelijk van verschillende voorwaarden. Hoe dan ook, het typische antwoord is om een waarschuwing te geven en een <code>null<\/code> te retourneren. Zie het onderstaande voorbeeld in PHP 7.4:<\/p>\n<pre><code class=\"language-php\">var_dump(strlen(new stdClass));<\/code><\/pre>\n<p>Dit zou de volgende waarschuwing opgeven:<\/p>\n<pre><code>Warning: strlen() expects parameter 1 to be string, object given in \/path\/to\/your\/test.php on line 4\nNULL<\/code><\/pre>\n<p>Als <code>strict_types<\/code> is ingeschakeld of argument information types specificeert, dan zien we ander gedrag. In dergelijke scenario&#8217;s wordt de type error gedetecteerd en resulteert het in een <code>TypeError<\/code>.<\/p>\n<p>Deze situatie zou leiden tot een aantal problemen. Dit wordt uitvoerig uitgelegd in de <a href=\"https:\/\/wiki.php.net\/rfc\/consistent_type_errors#issues\" target=\"_blank\" rel=\"noopener noreferrer\">Issues sectie van de RFC<\/a>.<\/p>\n<p>Om deze inconsistenties te verwijderen, <a href=\"https:\/\/wiki.php.net\/rfc\/consistent_type_errors\" target=\"_blank\" rel=\"noopener noreferrer\">stelt deze RFC voor<\/a> om de internal parameter die API&#8217;s parseert altijd een <code>ThrowError<\/code> te laten genereren in het geval een parameter type niet overeenkomt.<\/p>\n<p>Fatal error: Uncaught TypeError: strlen(): Argument #1 ($str) must be of type string, object given in \/path\/to\/your\/test.php:4<\/p>\n<pre><code>Fatal error: Uncaught TypeError: strlen(): Argument #1 ($str) must be of type string, object given in \/path\/to\/your\/test.php:4\nStack trace:\n#0 {main}\n  thrown in \/path\/to\/your\/test.php on line 4<\/code><\/pre>\n<h3 id=\"throw-expression\">throw Expression<\/h3>\n<p>In PHP is <code>throw<\/code> een <a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.intro.php\" target=\"_blank\" rel=\"noopener noreferrer\">statement<\/a>. Het is dus niet mogelijk om deze te gebruiken op plekken waar alleen een <a href=\"https:\/\/www.php.net\/manual\/en\/language.expressions.php\" target=\"_blank\" rel=\"noopener noreferrer\">expression<\/a> is toegestaan.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/throw_expression\" target=\"_blank\" rel=\"noopener noreferrer\">Deze RFC<\/a> stelt voor om het <a href=\"https:\/\/www.php.net\/manual\/en\/language.exceptions.php\" target=\"_blank\" rel=\"noopener noreferrer\"><code>throw<\/code> statement<\/a> om te zetten in een expression zodat deze ook kan worden gebruikt in context waarin expressions zijn toegestaan. Denk hierbij aan <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-7-4\/#arrow-functions\" target=\"_blank\" rel=\"noopener noreferrer\">arrow functions<\/a>, <a href=\"https:\/\/wiki.php.net\/rfc\/isset_ternary\" target=\"_blank\" rel=\"noopener noreferrer\">null coalesce operator<\/a>, <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.comparison.php#language.operators.comparison.ternary\" target=\"_blank\" rel=\"noopener noreferrer\">ternary en elvis operators<\/a>, etc.<\/p>\n<p>Bekijk de volgende voorbeelden van de RFC:<\/p>\n<pre><code class=\"language-php\">$callable = fn() =&gt; throw new Exception();\n\n\/\/ $value is non-nullable.\n$value = $nullableValue ?? throw new InvalidArgumentException();\n \n\/\/ $value is truthy.\n$value = $falsableValue ?: throw new InvalidArgumentException();<\/code><\/pre>\n<h3 id=\"weak-maps\">Weak Maps<\/h3>\n<p>Een weak map is een collectie van data (objects) waarin keys weakly referenced zijn. Dit voorkomt dat ze garbaged collected worden.<\/p>\n<p>PHP 7.4 voegde ondersteuning toe voor <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-7-4\/#weakreferences\" target=\"_blank\" rel=\"noopener noreferrer\">weak references<\/a> als een manier om een reference naar een object te behouden, maar dat niet verhindert dat het object zelf wordt vernietigd. Zoals Nikita Popov opmerkte,<\/p>\n<blockquote><p>&#8220;Raw weak references zijn op zichzelf van beperkt nut en weak maps worden in de praktijk veel vaker gebruikt. Het is niet mogelijk om een effici\u00ebnte weak map bovenop PHP weak references te implementeren, omdat de mogelijkheid om een destruction callback te registreren niet wordt geboden.&#8221;<\/p><\/blockquote>\n<p>Dat is waarom <a href=\"https:\/\/wiki.php.net\/rfc\/weak_maps\" target=\"_blank\" rel=\"noopener noreferrer\">deze RFC<\/a> een WeakMap class introduceert om objects te maken die kunnen worden gebruikt als weak map keys. Deze kunnen worden vernietigd en verwijderd van de weak map als er geen verdere verwijzingen zijn naar het key object.<\/p>\n<p>In langlopende processen zou dit memory leaks kunnen voorkomen en prestaties kunnen verbeteren. Bekijk het onderstaande voorbeeld van de RFC:<\/p>\n<pre><code class=\"language-php\">$map = new WeakMap;\n$obj = new stdClass;\n$map[$obj] = 42;\nvar_dump($map);<\/code><\/pre>\n<p>Met PHP zou de bovenstaande code het volgende resultaat opleveren (zie de <a href=\"https:\/\/3v4l.org\/o6lZX\/rfc#output\" target=\"_blank\" rel=\"noopener noreferrer\">code hier in actie<\/a>):<\/p>\n<pre><code>object(WeakMap)#1 (1) {\n\t[0]=&gt;\n\tarray(2) {\n\t\t[\"key\"]=&gt;\n\t\tobject(stdClass)#2 (0) {\n\t\t}\n\t\t[\"value\"]=&gt;\n\t\tint(42)\n\t}\n}<\/code><\/pre>\n<p>Als je het object unset, wordt de key automatisch uit de weak map verwijderd:<\/p>\n<pre><code class=\"language-php\">unset($obj);\nvar_dump($map);<\/code><\/pre>\n<p>Nu zou het resultaat het volgende zijn:<\/p>\n<pre><code>object(WeakMap)#1 (0) {\n}<\/code><\/pre>\n<p>Voor meer informatie over Weak Maps kan je het best <a href=\"https:\/\/wiki.php.net\/rfc\/weak_maps\" target=\"_blank\" rel=\"noopener noreferrer\">de RFC<\/a> lezen. Het voorstel was unaniem goedgekeurd.<\/p>\n<h3 id=\"trailing-commas\">Trailing comma in parameter list<\/h3>\n<p>Trailing commas zijn komma&#8217;s die zijn toegevoegd aan lijsten met items in verschillende contexten. PHP 7.2 introduceerde <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-7-2\/#trailing-commas-in-list-syntax\" target=\"_blank\" rel=\"noopener noreferrer\">trailing commas in list syntax<\/a> en PHP 7.3 introduceerde <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-7-3\/#trailing-comma-in-function-calls\" target=\"_blank\" rel=\"noopener noreferrer\">trailing commas in function calls<\/a>.<\/p>\n<p>PHP introduceert nu <a href=\"https:\/\/wiki.php.net\/rfc\/trailing_comma_in_parameter_list\" target=\"_blank\" rel=\"noopener noreferrer\">trailing commas in parameter lists<\/a> met functions, methods en closures. In onderstaand voorbeeld kan je meer zien:<\/p>\n<pre><code class=\"language-php\">class Foo {\n\tpublic function __construct(\n\t\tstring $x,\n\t\tint $y,\n\t\tfloat $z, \/\/ trailing comma\n\t) {\n\t\t\/\/ do something\n\t}\n}<\/code><\/pre>\n<p>Het voorstel werd aangenomen met 58 tegen 1 stemmen.<\/p>\n<h3 id=\"class-syntax-on-objects\">::class toegestaan voor objects<\/h3>\n<p>Om de naam van een class te fetchen, kan je de syntax <code>Foo\\Bar::class<\/code> gebruiken. <a href=\"https:\/\/wiki.php.net\/rfc\/class_name_literal_on_object\" target=\"_blank\" rel=\"noopener noreferrer\">Deze RFC<\/a> stelt voor om dezelfde syntax uit te breiden naar objects. Hierdoor is het nu mogelijk om de naam van de class van een bepaald object op te halen, zoals je in onderstaand voorbeeld kan zien:<\/p>\n<pre><code class=\"language-php\">$object = new stdClass;\nvar_dump($object::class); \/\/ \"stdClass\"\n \n$object = null;\nvar_dump($object::class); \/\/ TypeError<\/code><\/pre>\n<p>Met PHP 8 geeft <code>$object:class<\/code> hetzelfde resultaat als <code>get_class($object)<\/code>. Als <code>$object<\/code> geen object is, genereert het een <code>TypeError<\/code> exception.<\/p>\n<p>Dit voorstel was unaniem goedgekeurd.<\/p>\n<h3 id=\"attributes\">Attributes v2<\/h3>\n<p>Attributes, ook al bekend als annotations, zijn een vorm van structured metadata die kunnen worden gebruikt om properties te specificeren voor objects, elements of files.<\/p>\n<p>Tot PHP 7.4 waren doc-comments de enige manier om metadata toe te voegen aan declarations van classes, functions, etc. De <a href=\"https:\/\/wiki.php.net\/rfc\/attributes_v2\" target=\"_blank\" rel=\"noopener noreferrer\">Attributes v2 RFC<\/a> introduceert attributes voor PHP die ze defini\u00ebren als een vorm van structured, syntactic metadata die kunnen worden toegevoegd aan declarations van classes, properties, functions, methods, parameters en constants.<\/p>\n<p>Attributes worden toegevoegd v\u00f3\u00f3r de declarations waarnaar ze verwijzen. Bekijk de volgende voorbeelden van de RFC:<\/p>\n<pre><code class=\"language-php\">&lt;&gt;\nclass Foo\n{\n\t&lt;&gt;\n\tpublic const FOO = 'foo';\n\n\t&lt;&gt;\n\tpublic $x;\n\n\t&lt;&gt;\n\tpublic function foo(&lt;&gt; $bar) { }\n}\n\n$object = new &lt;&gt; class () { };\n\n&lt;&gt;\nfunction f1() { }\n\n$f2 = &lt;&gt; function () { };\n\n$f3 = &lt;&gt; fn () =&gt; 1;<\/code><\/pre>\n<p>Attributes kunnen voor of na een doc-block comment worden toegevoegd:<\/p>\n<pre><code class=\"language-php\">&lt;&gt;\n\/** docblock *\/\n&lt;&gt;\nfunction foo() {}<\/code><\/pre>\n<p>Elke declaration kan een of meerdere attributen hebben en elke attribute kan een of meer bijbehorende values hebben:<\/p>\n<pre><code class=\"language-php\">&lt;&gt;\n&lt;&lt;SingleArgument(0)&gt;&gt;\n&lt;&lt;FewArguments('Hello', 'World')&gt;&gt;\nfunction foo() {}<\/code><\/pre>\n<p>Bekijk de <a href=\"https:\/\/wiki.php.net\/rfc\/attributes_v2\" target=\"_blank\" rel=\"noopener noreferrer\">RFC<\/a> voor een meer gedetailleerd overzicht van PHP attributes, use cases en alternatieve syntax.<\/p>\n<h3 id=\"named-arguments\">Named Arguments<\/h3>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/named_params\">Named arguments<\/a> bieden een nieuwe manier om arguments door te geven aan een function in PHP:<\/p>\n<blockquote><p>Named arguments maken het doorgeven van arguments aan een function mogelijk op basis van de naam van de parameter in plaats van de positie van de parameter.<\/p><\/blockquote>\n<p>We kunnen named arguments doorgeven aan een function door simpelweg de naam van de parameter toe te voegen voor de waarde ervan:<\/p>\n<pre><code class=\"language-php\">callFunction(name: $value);<\/code><\/pre>\n<p>We mogen ook reserved keywords gebruiken, zoals te zien is in het onderstaande voorbeeld:<\/p>\n<pre><code class=\"language-php\">callFunction(array: $value);<\/code><\/pre>\n<p>We mogen de naam van een parameter echter niet dynamisch doorgeven. De parameter moet een identifier zijn en de <strong>volgende syntax is niet toegestaan<\/strong>:<\/p>\n<pre><code class=\"language-php\">callFunction($name: $value);<\/code><\/pre>\n<p>Volgens Nikita Popov, de auteur van deze RFC, bieden named arguments verschillende voordelen.<\/p>\n<p>Ten eerste zullen named argumenten ons helpen om meer begrijpelijke code te schrijven, omdat hun betekenis zelfdocumenterend is. Het onderstaande voorbeeld van de RFC spreekt voor zich:<\/p>\n<pre><code class=\"language-php\">array_fill(start_index: 0, num: 100, value: 50);<\/code><\/pre>\n<p>Bij named arguments maakt de volgorde niet uit. Dit betekent dat we niet worden gedwongen om argumenten door te geven aan een functie in dezelfde volgorde als de signature van de functie:<\/p>\n<pre><code class=\"language-php\">array_fill(value: 50, num: 100, start_index: 0);<\/code><\/pre>\n<p>Ook is het mogelijk om named arguments te combineren met positional arguments:<\/p>\n<pre><code class=\"language-php\">htmlspecialchars($string, double_encode: false);<\/code><\/pre>\n<p>Een ander groot voordeel van named arguments is dat ze het toestaan om alleen die arguments te specificeren die we daadwerkelijk willen veranderen en dat we geen default arguments hoeven op te geven als we de default values niet willen overschrijven. Het volgende voorbeeld uit de RFC maakt het duidelijk:<\/p>\n<pre><code class=\"language-php\">htmlspecialchars($string, default, default, false);\n\/\/ vs\nhtmlspecialchars($string, double_encode: false);<\/code><\/pre>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Als je een <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-ontwikkelaar-huren\/\">WordPress developer<\/a> bent, houd er dan rekening mee dat op het moment van schrijven named arguments kunnen leiden tot problemen met <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-5-6\/#named-parameters\">achterwaartse compatibiliteit<\/a>. Gebruik ze dus niet in productie zonder ze zorgvuldig te testen.<\/p>\n<\/aside>\n\n<p>Named arguments kunnen worden gebruikt met <a href=\"#attributes\">PHP attributes<\/a>, zoals getoond in het volgende voorbeeld van de RFC:<\/p>\n<pre><code class=\"language-php\">&lt;&lt;MyAttribute('A', b: 'B')&gt;&gt;\nclass Test {}<\/code><\/pre>\n<p>Het doorgeven van positional arguments na named arguments is echter niet toegestaan en zal resulteren in een compileerfout. Hetzelfde gebeurt wanneer dezelfde parameternaam twee keer wordt doorgegeven.<\/p>\n<p>Named arguments zijn vooral handig bij class declarations omdat constructors meestal een groot aantal parameters hebben en named arguments een meer &#8220;ergonomische&#8221; manier bieden om een class te declaren.<\/p>\n<p>Voor een uitgebreidere beschrijving van Named Arguments, met beperkingen, achterwaartse incompatibiliteiten en verschillende voorbeelden, zie de <a href=\"https:\/\/wiki.php.net\/rfc\/named_params\">Named Arguments RFC<\/a>.<\/p>\n<h3 id=\"nullsafe-operator\">Nullsafe Operator<\/h3>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/nullsafe_operator\">Deze RFC<\/a> introduceert de nullsafe operator <code>$-&gt;<\/code> met volledige <a href=\"https:\/\/en.wikipedia.org\/wiki\/Short-circuit_evaluation\">short-circuit evaluation<\/a>.<\/p>\n<p>Bij short-circuit evaluation wordt de tweede operator alleen ge\u00ebvalueerd als de eerste operator niet als <code>null<\/code> wordt ge\u00ebvalueerd. Als een operator binnen een chain naar <code>null<\/code> evalueert, stop de uitvoering van de hele chain en wordt deze ge\u00ebvalueerd naar <code>null<\/code>.<\/p>\n<p>Kijk naar de volgende voorbeelden van de RFC:<\/p>\n<pre><code class=\"language-php\">$foo = $a?-&gt;b();<\/code><\/pre>\n<p>Als <code>$a<\/code> null is, wordt method <code>b()<\/code> niet gecalled en wordt <code>$foo<\/code> op <code>null<\/code> gezet.<\/p>\n<p>Zie de <a href=\"https:\/\/wiki.php.net\/rfc\/nullsafe_operator\">nullsafe operator RFC<\/a> voor meer voorbeelden, uitzonderingen en toekomstige scope.<\/p>\n<h3 id=\"string-to-number-comparison\">Saner string to number comparisons<\/h3>\n<p>In eerdere PHP versies castte PHP een string eerst aan een nummer en voerde deze vervolgens de comparison uit tussen integers of floats bij het maken van een non-strict comparison tussen strings en nummers. Ook al was dit gedrag behoorlijk nuttig in verschillende scenario&#8217;s, het kan verkeerde resultaten opleveren die kunnen leiden tot bugs en\/of beveiligingsproblemen.<\/p>\n<p>Kijk naar het volgende voorbeeld van de RFC:<\/p>\n<pre><code class=\"language-php\">$validValues = [\"foo\", \"bar\", \"baz\"];\n$value = 0;\nvar_dump(in_array($value, $validValues));\n\/\/ bool(true)<\/code><\/pre>\n<p>PHP 8 introduceert <a href=\"https:\/\/wiki.php.net\/rfc\/string_to_number_comparison\">Saner string to number comparisons<\/a> met als doel om string to number comparisons logischer te maken. In de woorden van Nikita Popov,<\/p>\n<blockquote><p>Deze RFC is bedoeld om string to number comparisons een logischer gedrag te geven: bij het gebruiken van een numeric string, gebruik een number comparison (hetzelfde als nu). In andere gevallen converteer het nummer naar een string en gebruik een string comparison.<\/p><\/blockquote>\n<p>De volgende tabel vergelijkt het gedrag van string to number comparisons tussen eerdere PHP versies en PHP 8:<\/p>\n<pre>Comparison    | Before | After\n------------------------------\n 0 == \"0\"     | true   | true\n 0 == \"0.0\"   | true   | true\n <strong>0 == \"foo\"   | true   | false<\/strong>\n <strong>0 == \"\"      | true   | false<\/strong>\n42 == \"   42\" | true   | true\n<strong>42 == \"42foo\" | true   | false<\/strong><\/pre>\n<p>Lees meer over de vele implicaties van deze wijziging en hoe string to number comparisons veranderen in PHP 8 in de offici\u00eble <a href=\"https:\/\/wiki.php.net\/rfc\/string_to_number_comparison\">RFC van Nikita Popov<\/a>.<\/p>\n<h3 id=\"saner-numeric-strings\">Saner Numeric Strings<\/h3>\n<p>In PHP vallen strings met nummers in <a href=\"https:\/\/github.com\/php\/php-langspec\/blob\/be010b4435e7b0801737bb66b5bbdd8f9fb51dde\/spec\/05-types.md#the-string-type\">drie categorie\u00ebn<\/a>:<\/p>\n<ul>\n<li><strong>Numeric strings<\/strong>: strings die een nummer bevatten, optioneel voorafgegaan door spaties.<\/li>\n<li><strong>Leading-numeric string<\/strong>: strings waarvan de eerste tekens numerieke strings zijn en de achterliggende tekens niet-numeriek.<\/li>\n<li><strong>Non-numeric string<\/strong>: strings die in geen van de vorige categorie\u00ebn vallen.<\/li>\n<\/ul>\n<p>Numeric strings en leading-numeric strings worden verschillend behandeld, afhankelijk van de operation die wordt uitgevoerd. Bijvoorbeeld:<\/p>\n<ul>\n<li><strong>Explicit string to number conversions<\/strong> (dwz <code>(int)<\/code> en <code>(float)<\/code> tpe casts) converteren numeric en leading-numeric string nummers. Het expliciet converteren van een non-numeric string naar een nummer produceert 0.<\/li>\n<li><strong>Implicit string to number conversions<\/strong> (dwz geen <code>strict_type<\/code> declaration) leiden tot verschillende resultaten voor numeric en non-numeric strings. Non-numeric strings to number conversions genereren een <code>TypeError<\/code>.<\/li>\n<li><code>is_numeric()<\/code> retourneert alleen <strong>true<\/strong> voor numeric tekenreeksen.<\/li>\n<\/ul>\n<p>String offsets, arithmetic operations, incremend en decrement operations, string-to-string-comparisons en bitwise operations leiden ook tot verschillende resultaten.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/saner-numeric-strings\">Deze RFC<\/a> stelt voor om:<\/p>\n<blockquote><p>De verschillende numeric string modussen binnen \u00e9\u00e9n concept samen te brengen: alleen numeric string met zowel leading als trailing witruimte zijn toegestaan. Elk ander type string is non-numeric en genereert een TypeError bij gebruik in een numerieke context.<\/p><\/blockquote>\n<blockquote><p>Dit betekent dat alle strings die momenteel de <strong>E_NOTICE<\/strong> &#8220;A non well formed numeric value encountered&#8221; opleveren, opnieuw worden geclassificeerd in de <strong>E_WARNING<\/strong> &#8220;A non-numeric value encountered&#8221;, behalve als de leading-numeric string alleen trailing witruimte bevat. En de verschillende gevallen die momenteel een <strong>E_WARNING<\/strong> opleveren, zullen worden gepromoveerd tot <code>TypeError<\/code>s.<\/p><\/blockquote>\n<p>Zie de <a href=\"https:\/\/wiki.php.net\/rfc\/saner-numeric-strings\">RFC<\/a> voor een uitgebreider overzicht van numeric strings in PHP 8, met codevoorbeelden, uitzonderingen en achterwaartse compatibiliteitsproblemen.<\/p>\n<h3 id=\"match-expression\">Match Expression v2<\/h3>\n<p>De nieuwe <code>match<\/code> expressie lijkt veel op <code>switch<\/code>, maar met een veiligere semantiek en waardoor waarden kunnen worden geretourneerd.<\/p>\n<p>Bekijk het volgende <code>switch<\/code> voorbeeld van de <a href=\"https:\/\/wiki.php.net\/rfc\/match_expression_v2\">RFC<\/a> om het verschil tussen de twee control structures te begrijpen:<\/p>\n<pre><code class=\"language-php\">switch (1) {\n\tcase 0:\n\t\t$result = 'Foo';\n\t\tbreak;\n\tcase 1:\n\t\t$result = 'Bar';\n\t\tbreak;\n\tcase 2:\n\t\t$result = 'Baz';\n\t\tbreak;\n}\n \necho $result;\n\/\/&gt; Bar<\/code><\/pre>\n<p>We kunnen nu hetzelfde resultaat krijgen als de bovenstaande code met de volgende <code>match<\/code> expression:<\/p>\n<pre><code class=\"language-php\">echo match (1) {\n\t0 =&gt; 'Foo',\n\t1 =&gt; 'Bar',\n\t2 =&gt; 'Baz',\n};\n\/\/&gt; Bar<\/code><\/pre>\n<p>Een groot voordeel van het gebruik van de nieuwe <code>match<\/code> expression is dat, terwijl <code>switch<\/code> losjes values vergelijkt (<code>==<\/code>), wat mogelijk leidt tot onverwachte resultaten, bij match de vergelijking een identity check is (<code>===<\/code>).<\/p>\n<p>De <code>match<\/code> expression kan ook meerdere door komma&#8217;s gescheiden expressions bevatten, waardoor een beknoptere syntaxis mogelijk is (<a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.match.php\">bron<\/a>):<\/p>\n<pre><code class=\"language-php\">$result = match ($x) {\n\t\/\/ This match arm:\n\t$a, $b, $c =&gt; 5,\n\t\/\/ Is equivalent to these three match arms:\n\t$a =&gt; 5,\n\t$b =&gt; 5,\n\t$c =&gt; 5,\n};<\/code><\/pre>\n<p>Zie de <a href=\"https:\/\/wiki.php.net\/rfc\/match_expression_v2\">Match expression v2 RFC<\/a> en de <a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.match.php\">PHP documentatie<\/a> voor meer voorbeelden en use cases.<\/p>\n<h3 id=\"arithmetic-bitwise-operators\">Strengere type checks voor arithmetic\/bitwise operators<\/h3>\n<p>In eerdere versies van PHP was het applyen van <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.arithmetic.php\">arithmetic<\/a> en <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.bitwise.php\">bitwise<\/a> operators aan een array, resource of non-overloaded object toegestaan.\u00a0 Hoe dan ook, het gedrag was soms inconsistent.<\/p>\n<p>In <a href=\"https:\/\/wiki.php.net\/rfc\/arithmetic_operator_type_checks\">deze RFC<\/a> laat Nikita Popov zien hoe onlogisch dat gedrag zou kunnen zijn met een eenvoudig voorbeeld:<\/p>\n<pre><code class=\"language-php\">var_dump([] % [42]);\n\/\/ int(0)<\/code><\/pre>\n<p>Nikita legt uit hoe het applyen van een arithmetic of bitwise operator op arrays, resources of niet-overbelaste objecten <a href=\"https:\/\/wiki.php.net\/rfc\/arithmetic_operator_type_checks#current_behavior\">tot verschillende resultaten<\/a> leidde:<\/p>\n<blockquote><p>Operators +, -, *, \/, **:<\/p>\n<ul>\n<li>Geeft Error exception bij array operand. (Excluding + if beide operands array zijn.)<\/li>\n<li>Converteer een resource operand automatisch naar de resource ID als een integer.<\/li>\n<li>Converteer een object operand naar integer one, terwijl je een melding genereert.<\/li>\n<\/ul>\n<p>Operators %, &lt;&lt;, &gt;&gt;, &#038;, |, ^:<\/p>\n<ul>\n<li>Converteer een array operand naar integer zero als deze leeg is of integer one als deze niet leeg is.<\/li>\n<li>Converteer een resource operand automatisch naar de resource ID als een integer.<\/li>\n<li>Converteer een object operand naar integer one, terwijl je een melding genereert.<\/li>\n<\/ul>\n<p>Operator ~:<\/p>\n<ul>\n<li>Geeft een Error exception voor array, resource en object operands.<\/li>\n<\/ul>\n<p>Operators ++ and &#8211;:<\/p>\n<ul>\n<li>Doet niks als de operand een array, resource of object is.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Met PHP 8 veranderen zaken en is het gedrag hetzelfde voor alle arithmetic en bitwise operators:<\/p>\n<p><strong>Geeft een <code>TypeError<\/code> exception voor array, resource en object operands.<\/strong><\/p>\n<h2 id=\"new-php-functions\">Nieuwe PHP functions<\/h2>\n<p>PHP 8 brengt verschillende nieuwe functions naar de taal:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3 id=\"str_contains\">str_contains<\/h3>\n<p>Voor PHP 8 waren <a href=\"https:\/\/www.php.net\/manual\/en\/function.strstr.php\" target=\"_blank\" rel=\"noopener noreferrer\">strstr<\/a> en <a href=\"https:\/\/www.php.net\/manual\/en\/function.strpos.php\" target=\"_blank\" rel=\"noopener noreferrer\">strpos<\/a> de typische opties voor <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-ontwikkelaar-huren\/\" target=\"_blank\" rel=\"noopener noreferrer\">developers<\/a> om te zoeken naar een needle binnen een opgegeven string. Het probleem is dat beide functions niet erg intu\u00eftief zijn en het gebruik ervan kan verwarrend zijn voor nieuwe PHP ontwikkelaars. Zie het volgende voorbeeld:<\/p>\n<pre><code class=\"language-php\">$mystring = 'Managed WordPress Hosting';\n$findme = 'WordPress';\n$pos = strpos($mystring, $findme);\n\nif ($pos !== false) {\n\techo \"The string has been found\";\n} else {\n\techo \"String not found\";\n}<\/code><\/pre>\n<p>In het bovenstaande voorbeeld gebruikten we de comparison operator <code>!==<\/code> die ook controleert of twee values van hetzelfde type zijn. Dit voorkomt dat we een foutmelding krijgen <a href=\"https:\/\/www.php.net\/manual\/en\/function.strpos.php#refsect1-function.strpos-returnvalues\" target=\"_blank\" rel=\"noopener noreferrer\">als de positie van de needle 0 is<\/a>:<\/p>\n<blockquote><p>&#8220;Deze function kan Boolean <strong>FALSE<\/strong> retourneren, maar het kan ook een non-Boolean value die evaluates naar <strong>FALSE<\/strong>. [&#8230;] Gebruik de === operator om de teruggegeven value van deze function te testen.&#8221;<\/p><\/blockquote>\n<p>Bovendien bieden verschillende frameworks helper functions om te zoeken naar een value binnen een gegeven string (bekijk <a href=\"https:\/\/laravel.com\/docs\/7.x\/helpers#method-str-contains\" target=\"_blank\" rel=\"noopener noreferrer\">Laravel Helpers documentatie<\/a> als voorbeeld).<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/str_contains\" target=\"_blank\" rel=\"noopener noreferrer\">Deze RFC<\/a> stelt de introductie voor van een nieuwe function die het mogelijk maakt om binnen een string te zoeken: <code>str_contains<\/code>.<\/p>\n<pre><code class=\"language-php\">str_contains ( string $haystack , string $needle ) : bool<\/code><\/pre>\n<p>Het gebruik ervan is vrij eenvoudig. <code>str_contains<\/code> controleert of <code>$needle<\/code> wordt gevonden in $haystack en retourneert dienovereenkomstig <code>true<\/code> of <code>false<\/code>.<\/p>\n<p>Dankzij <code>str_contains<\/code> kunnen we dus de volgende code schrijven:<\/p>\n<pre><code class=\"language-php\">$mystring = 'Managed WordPress Hosting';\n$findme   = 'WordPress';\n\nif (str_contains($mystring, $findme)) {\n\techo \"The string has been found\";\n} else {\n\techo \"String not found\";\n}<\/code><\/pre>\n<p>Dit is veel beter leesbaar en bovendien minder vatbaar voor fouten (zie <a href=\"https:\/\/3v4l.org\/rcmEq\/rfc#git-php-master\" target=\"_blank\" rel=\"noopener noreferrer\">hier<\/a> de code in actie).<\/p>\n<p>Op moment van schrijven is <code>str_contains<\/code> hoofdlettergevoelig, maar dit kan in de toekomst veranderen.<\/p>\n<p>Het voorstel om <code>str_contains<\/code> toe te voegen werd aangenomen met 43 stemmen voor en 9 stemmen tegen.<\/p>\n<h3 id=\"str_starts_with-and-str_ends_with\">str_starts_with() and str_ends_with()<\/h3>\n<p>Naast de function <code>str_contains<\/code>, zijn er nog twee andere functions toegevoegd die het mogelijk maken om binnen een bepaalde string te zoeken naar een needle: <code>str_starts_with<\/code> en <code>str_ends_with<\/code>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/add_str_starts_with_and_ends_with_functions\">Deze nieuwe functions<\/a> controleren of een bepaalde string begint of eindigt met een andere string:<\/p>\n<pre><code class=\"language-php\">str_starts_with (string $haystack , string $needle) : bool\nstr_ends_with (string $haystack , string $needle) : bool<\/code><\/pre>\n<p>Beide functions retourneren <code>false<\/code> als <code>$needle<\/code> langer is dan $haystack.<\/p>\n<p>Volgens Will Hudgins, de auteur van deze RFC,<\/p>\n<blockquote><p>&#8220;De functionaliteit <code>str_starts_with<\/code> en <code>str_ends_with<\/code> is z\u00f3 nodig dat veel <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-frameworks\/\">grote PHP frameworks<\/a> het al ondersteunen, waaronder <a href=\"https:\/\/symfony.com\/doc\/5.0\/components\/string.html#methods-to-search-and-replace\">Symfony<\/a>, <a href=\"https:\/\/laravel.com\/docs\/7.x\/helpers#method-starts-with\">Laravel<\/a>, <a href=\"https:\/\/www.yiiframework.com\/doc\/api\/2.0\/yii-helpers-basestringhelper#startsWith()-detail\">Yii<\/a>, <a href=\"https:\/\/fuelphp.com\/docs\/classes\/str.html#\/method_starts_with\">FuelPHP<\/a> en <a href=\"https:\/\/docs.phalcon.io\/3.4\/en\/api\/phalcon_text\">Phalcon<\/a>.&#8221;<\/p><\/blockquote>\n<p>Dankzij hen kunnen we nu suboptimale en minder intu\u00eftieve functions vermijden als <code>substr<\/code>, <code>strpos<\/code>. Beide functions zijn hoofdlettergevoelig:<\/p>\n<pre><code class=\"language-php\">$str = \"WordPress\";\nif (str_starts_with($str, \"Word\")) echo \"Found!\";\n\nif (str_starts_with($str, \"word\")) echo \"Not found!\";<\/code><\/pre>\n<p>Je kan deze code <a href=\"https:\/\/3v4l.org\/kBcjZ\/rfc#output\" target=\"_blank\" rel=\"noopener noreferrer\">hier<\/a> in actie zien.<\/p>\n<p>De RFC heeft deze goedgekeurd met 51 voor en 4 stemmen tegen.<\/p>\n<h3 id=\"get_debug_type\">get_debug_type<\/h3>\n<p><code>get_debug_type<\/code> is <a href=\"https:\/\/wiki.php.net\/rfc\/get_debug_type\" target=\"_blank\" rel=\"noopener noreferrer\">een nieuwe PHP function<\/a> die het type van een variabele retourneert. De nieuwe function werkt op een vergelijkbare manier als de <a href=\"https:\/\/www.php.net\/manual\/en\/function.gettype.php\" target=\"_blank\" rel=\"noopener noreferrer\">gettype function<\/a>, maar <code>get_debug_type<\/code> retourneert native names en zorgt bij class names voor een resolve.<\/p>\n<p>Dit is een verbetering voor de taal, omdat <code>gettype()<\/code> niet erg nuttig is voor type checking.<\/p>\n<p>De RFC geeft twee handige voorbeelden om het verschil tussen de nieuwe functions <code>get_debug_type()<\/code> en <code>gettype()<\/code> beter te begrijpen. Het eerste voorbeeld toont de werking van gettype:<\/p>\n<pre><code class=\"language-php\">$bar = [1,2,3];\n\nif (!($bar instanceof Foo)) { \n\tthrow new TypeError('Expected ' . Foo::class . ', got ' . (is_object($bar) ? get_class($bar) : gettype($bar)));\n}<\/code><\/pre>\n<p>Met PHP 8 kan je in plaats daarvan <code>get_debug_type<\/code> gebruiken:<\/p>\n<pre><code class=\"language-php\">if (!($bar instanceof Foo)) { \n\tthrow new TypeError('Expected ' . Foo::class . ' got ' . get_debug_type($bar));\n}<\/code><\/pre>\n<p>De volgende tabel toont de returning values van <code>get_debug_type<\/code> en <code>gettype<\/code>:<\/p>\n<table>\n<thead>\n<tr>\n<th>Value<\/th>\n<th>gettype()<\/th>\n<th>get_debug_type()<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>integer<\/td>\n<td>int<\/td>\n<\/tr>\n<tr>\n<td>0.1<\/td>\n<td>double<\/td>\n<td>float<\/td>\n<\/tr>\n<tr>\n<td>true<\/td>\n<td>boolean<\/td>\n<td>bool<\/td>\n<\/tr>\n<tr>\n<td>false<\/td>\n<td>boolean<\/td>\n<td>bool<\/td>\n<\/tr>\n<tr>\n<td>null<\/td>\n<td>NULL<\/td>\n<td>null<\/td>\n<\/tr>\n<tr>\n<td>&#8220;WordPress&#8221;<\/td>\n<td>string<\/td>\n<td>string<\/td>\n<\/tr>\n<tr>\n<td>[1,2,3]<\/td>\n<td>array<\/td>\n<td>array<\/td>\n<\/tr>\n<tr>\n<td>A class with name &#8220;Foo\\Bar&#8221;<\/td>\n<td>object<\/td>\n<td>Foo\\Bar<\/td>\n<\/tr>\n<tr>\n<td>An anonymous class<\/td>\n<td>object<\/td>\n<td>class@anonymous<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"additional-rfcs\">Overige RFC&#8217;s<\/h2>\n<p>Hier is een korte lijst met aanvullende goedgekeurde verbeteringen die met PHP 8 gepaard gaan:<\/p>\n<ol>\n<li><strong>Stringable interface<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/stringable\" target=\"_blank\" rel=\"noopener noreferrer\">deze RFC<\/a> introduceert een Stringable interface die automatisch wordt toegevoegd aan classes die de <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.magic.php#object.tostring\" target=\"_blank\" rel=\"noopener noreferrer\"><code>__to String()<\/code> method<\/a> Het voornaamste doel is om hier de union type <code>string|Stringable<\/code> te gebruiken.<\/li>\n<li><strong>Nieuwe DOM Living Standard API&#8217;s in ext\/dom<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/dom_living_standard_api\" target=\"_blank\" rel=\"noopener noreferrer\">deze RFC<\/a> stelt voor om de huidige <a href=\"https:\/\/dom.spec.whatwg.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">DOM Living Standard<\/a> te implementeren in de <a href=\"https:\/\/www.php.net\/manual\/en\/intro.dom.php\" target=\"_blank\" rel=\"noopener noreferrer\">PHP DOM extensie<\/a> door nieuwe interfaces en public properties te introduceren.<\/li>\n<li><strong>Static return type<\/strong>: PHP 8 introduceert het gebruik van static als return type, naast <code>self<\/code> en <code>parent<\/code><\/li>\n<li><strong>Variable syntax tweaks<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/variable_syntax_tweaks\" target=\"_blank\" rel=\"noopener noreferrer\">deze RFC<\/a> lost enkele resterende inconsistenties op in de variable syntax van PHP..<\/li>\n<\/ol>\n<h2>PHP 8 prestatiebenchmarks<\/h2>\n<p>Als je je afvraagt hoe snel PHP 8 is, dan hebben wij het antwoord. We hebben <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-benchmarks\/\">20 PHP platforms\/configuraties gebenchmarkt<\/a> op 7 verschillende PHP versies (5.6, 7.0, 7.1, 7.2, 7.3 en 8.0).<\/p>\n<p>PHP 8.0 kwam als winnaar uit de bus op de meeste platforms die dit ondersteunen, waaronder <a href=\"https:\/\/kinsta.com\/nl\/blog\/laravel-vs-wordpress\/\">WordPress en Laravel<\/a>.<\/p>\n<figure id=\"attachment_88757\" aria-describedby=\"caption-attachment-88757\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-88757 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/02\/Kinsta-PHP-Benchmarks-2021-Compilation.png\" alt=\"Samengestelde PHP benchmarks van de top platforms\" width=\"1100\" height=\"799\"><figcaption id=\"caption-attachment-88757\" class=\"wp-caption-text\">Samengestelde PHP benchmarks van de top platforms<\/figcaption><\/figure>\n<p>WordPress op PHP 8.0 kan bijvoorbeeld <strong>18,4%<\/strong> meer verzoeken per seconde verwerken dan PHP 7.4. Laravel op PHP 8.0 kan <strong>8,5%<\/strong> meer aanvragen per seconde verwerken dan PHP 7.3.<\/p>\n<p>Als je website of app volledig compatibel is met PHP 8.0, moet je het zo snel mogelijk bijwerken van de omgeving van <a href=\"https:\/\/kinsta.com\/nl\/changelog\/php-8\/\">je server naar PHP 8.0 inplannen<\/a>. Jij (en je gebruikers) zullen de prestatievoordelen zeker waarderen. Test je site echter grondig voordat je de update uitvoert.<\/p>\n<p>Je kunt ons <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-benchmarks\/\">PHP benchmarkartikel<\/a> lezen voor meer informatie, zoals gedetailleerde prestatiegegevens, inzichten en mooie grafieken!<\/p>\n\n<h2>Samenvatting<\/h2>\n<p>Wat een rit! In dit bericht hebben we de meest interessante optimalisaties en features van PHP 8 besproken. Waar jullie het meest naar uit hebben gekeken is waarschijnlijk de Just in Time compiler, maar er zoveel meer in PHP 8.<\/p>\n<p>Zorg ervoor dat je dit blogbericht als bladwijzer gebruikt voor toekomstig gebruik. \ud83e\udd13<\/p>\n<p>Nu is het jouw beurt: ben je klaar om de nieuwe PHP features te testen? Welke is jouw favoriet? Je kan je antwoord in het reactiegedeelte hieronder kwijt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PHP 8 is officieel uitgebracht voor &#8220;General Availability&#8221; op 26 november 2020! Deze nieuwe grote update bevat een hele reeks optimalisaties en krachtige features en we &#8230;<\/p>\n","protected":false},"author":36,"featured_media":32018,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[32,29],"topic":[867],"class_list":["post-32012","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-php","tag-webdev","topic-php-updates"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Wat nieuw is in PHP 8 (functies, verbeteringen en de JIT Compiler)<\/title>\n<meta name=\"description\" content=\"PHP 8 wordt naar verwachting op 3 december 2020 uitgebracht. Het brengt nieuwe features, deprecations en performanceboosts. Check wat er nieuw is in PHP 8!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/nl\/blog\/php-8\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Wat nieuw is in PHP 8 (functies, verbeteringen en de JIT Compiler)\" \/>\n<meta property=\"og:description\" content=\"PHP 8 wordt naar verwachting op 3 december 2020 uitgebracht. Het brengt nieuwe features, deprecations en performanceboosts. Check wat er nieuw is in PHP 8!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/nl\/blog\/php-8\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-28T06:57:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-16T10:17:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/php-8.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Carlo Daniele\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"PHP 8 wordt naar verwachting op 3 december 2020 uitgebracht. Het brengt nieuwe features, deprecations en performanceboosts. Check wat er nieuw is in PHP 8!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/php-8.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_NL\" \/>\n<meta name=\"twitter:label1\" content=\"Geschreven door\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data2\" content=\"29 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Wat nieuw is in PHP 8 (functies, verbeteringen en de JIT Compiler)\",\"datePublished\":\"2020-05-28T06:57:06+00:00\",\"dateModified\":\"2023-08-16T10:17:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8\/\"},\"wordCount\":5359,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/php-8.jpg\",\"keywords\":[\"php\",\"webdev\"],\"articleSection\":[\"WordPress ontwikkeling\"],\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/php-8\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8\/\",\"url\":\"https:\/\/kinsta.com\/nl\/blog\/php-8\/\",\"name\":\"Wat nieuw is in PHP 8 (functies, verbeteringen en de JIT Compiler)\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/php-8.jpg\",\"datePublished\":\"2020-05-28T06:57:06+00:00\",\"dateModified\":\"2023-08-16T10:17:41+00:00\",\"description\":\"PHP 8 wordt naar verwachting op 3 december 2020 uitgebracht. Het brengt nieuwe features, deprecations en performanceboosts. Check wat er nieuw is in PHP 8!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/php-8\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/php-8.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/php-8.jpg\",\"width\":1460,\"height\":730,\"caption\":\"PHP 8\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/nl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP updates\",\"item\":\"https:\/\/kinsta.com\/nl\/onderwerpen\/php-updates\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Wat nieuw is in PHP 8 (functies, verbeteringen en de JIT Compiler)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/nl\/#website\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Snelle, veilige, premium hostingoplossingen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/nl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\",\"https:\/\/x.com\/Kinsta_NL\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"caption\":\"Carlo Daniele\"},\"description\":\"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.\",\"sameAs\":[\"https:\/\/frammentidicodice.com\/\",\"https:\/\/x.com\/carlodaniele\"],\"url\":\"https:\/\/kinsta.com\/nl\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Wat nieuw is in PHP 8 (functies, verbeteringen en de JIT Compiler)","description":"PHP 8 wordt naar verwachting op 3 december 2020 uitgebracht. Het brengt nieuwe features, deprecations en performanceboosts. Check wat er nieuw is in PHP 8!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/nl\/blog\/php-8\/","og_locale":"nl_NL","og_type":"article","og_title":"Wat nieuw is in PHP 8 (functies, verbeteringen en de JIT Compiler)","og_description":"PHP 8 wordt naar verwachting op 3 december 2020 uitgebracht. Het brengt nieuwe features, deprecations en performanceboosts. Check wat er nieuw is in PHP 8!","og_url":"https:\/\/kinsta.com\/nl\/blog\/php-8\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","article_published_time":"2020-05-28T06:57:06+00:00","article_modified_time":"2023-08-16T10:17:41+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/php-8.jpg","type":"image\/jpeg"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"PHP 8 wordt naar verwachting op 3 december 2020 uitgebracht. Het brengt nieuwe features, deprecations en performanceboosts. Check wat er nieuw is in PHP 8!","twitter_image":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/php-8.jpg","twitter_creator":"@carlodaniele","twitter_site":"@Kinsta_NL","twitter_misc":{"Geschreven door":"Carlo Daniele","Geschatte leestijd":"29 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/nl\/blog\/php-8\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/blog\/php-8\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Wat nieuw is in PHP 8 (functies, verbeteringen en de JIT Compiler)","datePublished":"2020-05-28T06:57:06+00:00","dateModified":"2023-08-16T10:17:41+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/php-8\/"},"wordCount":5359,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/php-8\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/php-8.jpg","keywords":["php","webdev"],"articleSection":["WordPress ontwikkeling"],"inLanguage":"nl-NL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/nl\/blog\/php-8\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/nl\/blog\/php-8\/","url":"https:\/\/kinsta.com\/nl\/blog\/php-8\/","name":"Wat nieuw is in PHP 8 (functies, verbeteringen en de JIT Compiler)","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/php-8\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/php-8\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/php-8.jpg","datePublished":"2020-05-28T06:57:06+00:00","dateModified":"2023-08-16T10:17:41+00:00","description":"PHP 8 wordt naar verwachting op 3 december 2020 uitgebracht. Het brengt nieuwe features, deprecations en performanceboosts. Check wat er nieuw is in PHP 8!","breadcrumb":{"@id":"https:\/\/kinsta.com\/nl\/blog\/php-8\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/nl\/blog\/php-8\/"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/blog\/php-8\/#primaryimage","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/php-8.jpg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/php-8.jpg","width":1460,"height":730,"caption":"PHP 8"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/nl\/blog\/php-8\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/nl\/"},{"@type":"ListItem","position":2,"name":"PHP updates","item":"https:\/\/kinsta.com\/nl\/onderwerpen\/php-updates\/"},{"@type":"ListItem","position":3,"name":"Wat nieuw is in PHP 8 (functies, verbeteringen en de JIT Compiler)"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/nl\/#website","url":"https:\/\/kinsta.com\/nl\/","name":"Kinsta\u00ae","description":"Snelle, veilige, premium hostingoplossingen","publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/nl\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/nl\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","https:\/\/x.com\/Kinsta_NL","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","caption":"Carlo Daniele"},"description":"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.","sameAs":["https:\/\/frammentidicodice.com\/","https:\/\/x.com\/carlodaniele"],"url":"https:\/\/kinsta.com\/nl\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/32012","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/comments?post=32012"}],"version-history":[{"count":16,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/32012\/revisions"}],"predecessor-version":[{"id":54990,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/32012\/revisions\/54990"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32012\/translations\/en"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32012\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32012\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32012\/translations\/pt"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32012\/translations\/jp"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32012\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32012\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32012\/translations\/nl"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32012\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32012\/translations\/se"},{"href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32012\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media\/32018"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media?parent=32012"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/tags?post=32012"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/topic?post=32012"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}