{"id":45806,"date":"2022-09-20T10:30:59","date_gmt":"2022-09-20T08:30:59","guid":{"rendered":"https:\/\/kinsta.com\/nl\/?p=45806&#038;preview=true&#038;preview_id=45806"},"modified":"2023-06-15T14:29:46","modified_gmt":"2023-06-15T12:29:46","slug":"php-8-2","status":"publish","type":"post","link":"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/","title":{"rendered":"Wat is er nieuw in PHP 8.2 &#8211; Nieuwe functies, afschrijvingen, veranderingen en meer"},"content":{"rendered":"<p>PHP 8.2 bouwt voort op de vernieuwde basis van <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-8\/\">PHP 8.0<\/a> en <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-8-1\/\">PHP 8.1<\/a>. Nu <a href=\"https:\/\/www.php.net\/releases\/8.2\/en.php\">PHP 8.2<\/a> is uitgebracht zullen we in detail bespreken wat er nieuw is in PHP 8.2 &#8211; van de nieuwe features en verbeteringen tot deprecaties en kleine wijzigingen, we zullen ze allemaal doornemen.<\/p>\n<p>Omdat PHP 8.2 op 19 juli 2022 zijn feature freeze inging, kun je geen belangrijke toevoegingen aan deze lijst verwachten.<\/p>\n<p>Enthousiast? Wij ook!<\/p>\n<p>Laten we beginnen!<\/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>Nieuwe functies en verbeteringen in PHP 8.2<\/h2>\n<p>Laten we beginnen met het verkennen van alle nieuwste functies van PHP 8.2. En dit is nogal een uitgebreide lijst:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"15\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Nieuwe <code>readonly<\/code> classes<\/h3>\n<p>PHP 8.1 introduceerde de <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-8-1\/#new-readonly-properties\">functie<code>readonly<\/code> voor properties van classes<\/a>. Nu voegt PHP 8.2 ondersteuning toe om <a href=\"https:\/\/wiki.php.net\/rfc\/readonly_classes\">de hele class te declareren als <code>readonly<\/code><\/a>.<\/p>\n<p>Als je een class declaret als <code>readonly<\/code>, inheriten alle properties automatisch de property <code>readonly<\/code>. Het declareren van een class <code>readonly<\/code> is dus hetzelfde als het declareren van alle class-properties als <code>readonly<\/code>.<\/p>\n<p>Met PHP 8.1 moest je bijvoorbeeld deze lastige code schrijven om alle class-properties te declareren als <code>readonly<\/code>:<\/p>\n<pre><code class=\"language-php\">class MyClass\n{\npublic readonly string $myValue,\npublic readonly int $myOtherValue\npublic readonly string $myAnotherValue\npublic readonly int $myYetAnotherValue\n}<\/code><\/pre>\n<p>Stel je hetzelfde voor met nog veel meer properties. Met PHP 8.2 kun je gewoon dit schrijven:<\/p>\n<pre><code class=\"language-php\">readonly class MyClass\n{\npublic string $myValue,\npublic int $myOtherValue\npublic string $myAnotherValue\npublic int $myYetAnotherValue\n}<\/code><\/pre>\n<p>Je kunt ook abstracte of definitieve classes declareren als <code>readonly<\/code>. Hierbij maakt de volgorde van de woorden niet uit.<\/p>\n<pre><code class=\"language-php\">abstract readonly class Free {}\nfinal readonly class Dom {}<\/code><\/pre>\n<p>Je kunt ook een <code>readonly<\/code> class declareren zonder properties. Dit voorkomt in feite dynamische properties, terwijl childclasses toch hun <code>readonly<\/code> properties expliciet kunnen declareren.<\/p>\n<p>Vervolgens kunnen <code>readonly<\/code> classes alleen typed properties bevatten &#8211; dezelfde regel voor het declareren van individuele <strong>readonly<\/strong> properties.<\/p>\n<p>Je kunt de <code>mixed<\/code> type property gebruiken als je geen strikt typed property kunt declareren.<\/p>\n<p>Proberen een <code>readonly<\/code> class te declareren zonder een typed property levert een Fatal error op:<\/p>\n<pre><code class=\"language-php\">readonly class Type {\n    public $nope;\n}\nFatal error: Readonly property Type::$nope must have type in ... on line ... <\/code><\/pre>\n<p>Verder kun je <code>readonly<\/code> niet declareren voor bepaalde PHP-properties:<\/p>\n<ul>\n<li><strong>Enums <\/strong>(omdat <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-8-1\/#enums\">ze geen enkele property kunnen bevatten<\/a>)<\/li>\n<li><strong>Traits<\/strong><\/li>\n<li><strong>Interfaces<\/strong><\/li>\n<\/ul>\n<p>Pogingen om een van deze functies te declareren als <code>readonly<\/code> leiden tot een Parse error.<\/p>\n<pre><code class=\"language-php\">readonly interface Destiny {}\nParse error: syntax error, unexpected token \"interface\", expecting \"abstract\" or \"final\" or \"readonly\" or \"class\" in ... on line ...<\/code><\/pre>\n<p>Zoals voor alle PHP keywords geldt, is ook het keyword <code>readonly<\/code> hoofdletterongevoelig.<\/p>\n<p>PHP 8.2 schrijft verder dynamische properties af (daarover later meer). Maar je kunt niet voorkomen dat dynamische properties aan een class worden toegevoegd. Als je dat echter doet voor een class <code>readonly<\/code>, levert dat alleen een Fatal Error op.<\/p>\n<pre><code class=\"language-php\">Fatal error: Readonly property Test::$test must have type in ... on line ...<\/code><\/pre>\n<h3><code>true<\/code>, <code>false<\/code>, en <code>null<\/code> toegestaan als zelfstandige types<\/h3>\n<p>PHP kent al scalaire types als <code>int<\/code>, <code>string<\/code>, en <code>bool<\/code>. Dat werd uitgebreid in PHP 8.0 met de toevoeging van <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-8\/#union-types-2-0\">union types<\/a>, waardoor waarden van verschillende types kunnen zijn. Dezelfde RFC stond ook het gebruik toe van <code>false<\/code> en <code>null<\/code> als onderdeel van een union type &#8211; maar niet als zelfstandige types.<\/p>\n<p>Als je probeerde <code>false<\/code> of <code>null<\/code> of als zelfstandige types te declareren &#8211; zonder dat ze deel uitmaakten van een union type &#8211; leverde dat een fatal error op.<\/p>\n<pre><code class=\"language-php\">function spam(): null {}\nfunction eggs(): false {}\n\nFatal error: Null can not be used as a standalone type in ... on line ...\nFatal error: False can not be used as a standalone type in ... on line ...<\/code><\/pre>\n<p>Om dit scenario te vermijden voegt PHP 8.2 ondersteuning toe voor het gebruik van <a href=\"https:\/\/wiki.php.net\/rfc\/null-false-standalone-types\"><code>false<\/code> en <code>null<\/code><\/a> als zelfstandige types. Met deze toevoeging is het typesysteem van PHP expressiever en completer. Je kunt nu de return, parameter en property types nauwkeurig declareren.<\/p>\n<p>Ook bevat PHP nog steeds geen <code>true<\/code> type, dat een natuurlijke tegenhanger lijkt te zijn van het <code>false<\/code> type. PHP 8.2 lost dat op en <a href=\"https:\/\/wiki.php.net\/rfc\/true-type\">voegt ook ondersteuning toe voor het type <code>true<\/code><\/a>. Het staat geen co\u00ebrcie toe, precies zoals het type <code>false<\/code> zich gedraagt.<\/p>\n<p>Zowel de <code>true<\/code> als de <code>false<\/code> types zijn in wezen een union type van PHP&#8217;s <code>bool<\/code> type. Om redundantie te voorkomen, kun je deze drie types niet samen declareren in een union type. Doe je dat wel, dan krijg je een fatale compileerfout.<\/p>\n<h3>Disjunctive Normal Form (DNF) types<\/h3>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Disjunctive_normal_form\">Disjunctive Normal Form (DNF)<\/a> is een gestandaardiseerde manier om boolean expressions te organiseren. Het bestaat uit een disjunctie van conjunctions &#8211; in booleaanse termen is dat een <strong>OR van AND&#8217;s<\/strong>.<\/p>\n<p>Door DNF toe te passen op type-declaraties ontstaat een standaard manier om gecombineerde Union en <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-8-1\/#pure-intersection-types\">Intersection types<\/a> te schrijven die de parser kan verwerken. PHP 8.2&#8217;s <a href=\"https:\/\/wiki.php.net\/rfc\/dnf_types\">nieuwe functie DNF types<\/a> is eenvoudig maar krachtig, mits goed gebruikt.<\/p>\n<p>De RFC geeft het volgende voorbeeld. Het gaat ervan uit dat de volgende interface en class definities al bestaan:<\/p>\n<pre><code class=\"language-php\">interface A {}\ninterface B {}\ninterface C extends A {}\ninterface D {}\n\nclass W implements A {}\nclass X implements B {}\nclass Y implements A, B {}\nclass Z extends Y implements C {}<\/code><\/pre>\n<p>Met DNF types kun je type-declaraties voor properties, parameters en returrn values als volgt uitvoeren:<\/p>\n<pre><code class=\"language-php\">\/\/ Accepts an object that implements both A and B,\n\/\/ OR an object that implements D\n(A&B)|D\n\n\/\/ Accepts an object that implements C, \n\/\/ OR a child of X that also implements D,\n\/\/ OR null\nC|(X&D)|null\n\n\/\/ Accepts an object that implements all three of A, B, and D, \n\/\/ OR an int, \n\/\/ OR null.\n(A&B&D)|int|null<\/code><\/pre>\n<p>In sommige gevallen zijn de properties niet in DNF-vormen. Ze als zodanig declareren levert een parsefout op. Maar je kunt ze altijd herschrijven als:<\/p>\n<pre><code class=\"language-php\">A&(B|D)\n\/\/ Can be rewritten as (A&B)|(A&D)\n\nA|(B&(D|W)|null)\n\/\/ Can be rewritten as A|(B&D)|(B&W)|null<\/code><\/pre>\n<p>Let op dat elk segment van een DNF type uniek moet zijn. Zo is het declareren van <code>(A&B)|(B&A)<\/code> ongeldig, omdat de twee <strong>ge-OR-ede <\/strong>segmenten logisch gezien hetzelfde zijn.<\/p>\n<p>Bovendien zijn segmenten die strikte subsegmenten zijn van het andere segment ook niet toegestaan. Dat komt omdat de superset al alle instanties van de subset bevat, waardoor het gebruik van DNF overbodig wordt.<\/p>\n<h3>Sensitive parameters in back traces bewerken<\/h3>\n<p>Zoals bijna elke <a href=\"https:\/\/kinsta.com\/nl\/blog\/beste-programmeertaal-om-te-leren\/\">programmeertaal<\/a> maakt <a href=\"https:\/\/kinsta.com\/php\/\">PHP<\/a> het mogelijk om de callstack op elk punt in de uitvoering van de code te traceren. Stack tracing maakt het gemakkelijk om code te debuggen om fouten en prestatieproblemen op te lossen. Het vormt de ruggengraat van tools zoals <a href=\"https:\/\/kinsta.com\/nl\/apm-tool\/\">Kinsta APM<\/a>, onze op maat ontworpen <a href=\"https:\/\/kinsta.com\/nl\/blog\/application-performance-monitoring\/\">tool voor prestatiemonitoring<\/a> van WordPress sites.<\/p>\n<figure id=\"attachment_121608\" aria-describedby=\"caption-attachment-121608\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-121608 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/04\/Kinsta-APM-WooCommerce-Admin-Slow-Transactions.jpg\" alt=\"Traceren van trage WooCommerce transacties met Kinsta APM.\" width=\"1100\" height=\"659\"><figcaption id=\"caption-attachment-121608\" class=\"wp-caption-text\">Traceren van trage WooCommerce transacties met Kinsta APM.<\/figcaption><\/figure>\n<p>Het uitvoeren van een stack trace stopt de uitvoering van het programma niet. Gewoonlijk worden de meeste stack traces op de achtergrond uitgevoerd en stilletjes gelogd &#8211; voor latere inspectie indien nodig.<\/p>\n<p>Sommige van deze gedetailleerde PHP stack traces kunnen echter een nadeel zijn als je ze deelt met externe diensten &#8211; meestal voor <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-error-log\/\">analyse van foutenlogs<\/a>, foutopsporing, enz. Deze stack traces kunnen gevoelige informatie bevatten, zoals gebruikersnamen, wachtwoorden en omgevingsvariabelen.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/redact_parameters_in_back_traces\">Dit RFC voorstel<\/a> geeft zo&#8217;n voorbeeld:<\/p>\n<blockquote><p>Een veel voorkomende &#8220;overtreder&#8221; is PDO die het databasewachtwoord als constructor parameter ziet en onmiddellijk binnen de constructor probeert te verbinden met de database, in plaats van een pure constructor en een <strong>aparte -&gt;connect()<\/strong> methode. Als de databaseverbinding mislukt, bevat de stack trace dus het databasewachtwoord:<\/p>\n<pre><code class=\"language-php\">PDOException: SQLSTATE[HY000] [2002] No such file or directory in \/var\/www\/html\/test.php:3\nStack trace: #0 \/var\/www\/html\/test.php(3): PDO-&gt;__construct('mysql:host=loca...', 'root', 'password')\n#1 {main}<\/code><\/pre>\n<\/blockquote>\n<p>Met PHP 8.2 kun je <a href=\"https:\/\/wiki.php.net\/rfc\/redact_parameters_in_back_traces\">zulke gevoelige parameters markeren<\/a> met een nieuw <code>SensitiveParameter<\/code> attribuut. Elke sensivite gemarkeerde parameter wordt niet vermeld in je back traces. Je kunt ze dus zonder zorgen delen met externe diensten.<\/p>\n<p>Hier is een eenvoudig voorbeeld met een enkele sensivite parameter:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nfunction example(\n    $ham,\n    #[SensitiveParameter] $eggs,\n    $butter\n) {\n    throw new Exception('Error');\n}\n\nexample('ham', 'eggs', 'butter');\n\n\/*\nFatal error: Uncaught Exception: Error in test.php:8\nStack trace:\n#0 test.php(11): test('ham', Object(SensitiveParameterValue), 'butter')\n#1 {main}\nthrown in test.php on line 8\n*\/<\/code><\/pre>\n<p>Wanneer je een backt race genereert, wordt elke parameter met het <code>SensitiveParameter<\/code> attribuut vervangen door een <code>SensitiveParameterValue<\/code> object, en de echte waarde ervan wordt nooit opgeslagen in de trace. Het <code>SensitiveParameterValue<\/code> object kapselt de werkelijke parameterwaarde in &#8211; als je die om welke reden dan ook nodig hebt.<\/p>\n<h3>Nieuwe <code>mysqli_execute_query<\/code> functie en <code>mysqli::execute_query<\/code> methode<\/h3>\n<p>Heb je ooit de <code>mysqli_query()<\/code> functie gebruikt met gevaarlijk ontsnappende gebruikerswaarden om een MySQLi query met parameters uit te voeren?<\/p>\n<p>PHP 8.2 maakt <a href=\"https:\/\/wiki.php.net\/rfc\/mysqli_execute_query\">het uitvoeren van geparametriseerde MySQLi queries eenvoudiger<\/a> met de nieuwe <code>mysqli_execute_query($sql, $params)<\/code> functie en <code>mysqli::execute_query<\/code> methode.<\/p>\n<p>In wezen is deze nieuwe functie een combinatie van de functies <code>mysqli_prepare()<\/code>, <code>mysqli_execute()<\/code> en <code>mysqli_stmt_get_result()<\/code>. Hiermee wordt de MySQLi query voorbereid, gebonden (als je parameters doorgeeft), en uitgevoerd binnen de functie zelf. Als de query succesvol wordt uitgevoerd, geeft hij een <code>mysqli_result<\/code> object terug. Als hij niet succesvol is, geeft hij <code>false<\/code> terug.<\/p>\n<p>Het RFC voorstel geeft een eenvoudig maar krachtig voorbeeld:<\/p>\n<pre><code class=\"\"language-php\">foreach ($db-&gt;execute_query('SELECT * FROM user WHERE name LIKE ? AND type_id IN (?, ?)', [$name, $type1, $type2]) as $row) {\nprint_r($row);\n}<\/code><\/pre>\n<h3><code>enum<\/code> properties fetchen in <code>const<\/code> expressions<\/h3>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/fetch_property_in_const_expressions\">Deze RFC stelt voor<\/a> om de <code>-&gt;\/?-&gt;<\/code> operator toe te staan om <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-8-1\/#enums\"><code>enum<\/code><\/a> properties in <code>const<\/code> expressions te fetchen.<\/p>\n<p>De belangrijkste reden voor deze nieuwe functie is dat je <code>enum<\/code> objecten op sommige plaatsen niet kunt gebruiken, zoals array-keys. In zo&#8217;n geval moet je de waarde van de <code>enum<\/code> case herhalen om het te kunnen gebruiken.<\/p>\n<p>Het toestaan van het fetchen van <code>enum<\/code> properties op plaatsen waar <code>enum<\/code> objecten niet zijn toegestaan, kan deze procedure vereenvoudigen.<\/p>\n<p>Het betekent dat de volgende code nu geldig is:<\/p>\n<pre><code class=\"language-php\">const C = [self::B-&gt;value =&gt; self::B];<\/code><\/pre>\n<p>En voor de zekerheid bevat deze RFC ook ondersteuning voor de nullsafe operator <code>?-&gt;<\/code>.<\/p>\n<h3>Constanten toestaan in Traits<\/h3>\n<p>PHP bevat een manier om code te hergebruiken, genaamd Traits. Ze zijn geweldig voor hergebruik van code in verschillende classes.<\/p>\n<p>Momenteel kun je met Traits alleen methoden en properties defini\u00ebren, maar geen constanten. Dat betekent dat je invarianten die door een Trait worden verwacht niet in de Trait zelf kunt defini\u00ebren. Om deze beperking te omzeilen, moet je constanten defini\u00ebren in de composing class of in een interface die door de composing class wordt ge\u00efmplementeerd.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/constants_in_traits\">Deze RFC stelt voor<\/a> om het defini\u00ebren van constanten in Traits toe te staan. Deze constanten kunnen worden gedefinieerd zoals je classconstanten zou defini\u00ebren. Dit voorbeeld uit de RFC verduidelijkt het gebruik ervan:<\/p>\n<pre><code class=\"language-php\">trait Foo {\n    public const FLAG_1 = 1;\n    protected const FLAG_2 = 2;\n    private const FLAG_3 = 2;\n\n    public function doFoo(int $flags): void {\n        if ($flags & self::FLAG_1) {\n            echo 'Got flag 1';\n        }\n        if ($flags & self::FLAG_2) {\n            echo 'Got flag 2';\n        }\n        if ($flags & self::FLAG_3) {\n        echo 'Got flag 3';\n        }\n    }\n}<\/code><\/pre>\n<p>Trait-constanten worden ook samengevoegd in de definitie van de composing class, net als de definities van properties en methoden van een Trait. Ze hebben ook dezelfde beperkingen als properties van Traits. Zoals opgemerkt in de RFC, moet dit voorstel &#8211; hoewel een goed begin &#8211; verder worden uitgewerkt.<\/p>\n<h2>Afschrijvingen in PHP 8.2<\/h2>\n<p>Nu is het tijd om naar alle afschrijvingen in PHP 8.2 te kijken. Deze lijst is (gelukkig) niet zo groot als de nieuwe features:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"15\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Afschrijving van dynamische properties (en nieuw attribuut <code>#[AllowDynamicProperties]<\/code>)<\/h3>\n<p>Tot PHP 8.1 kon je in PHP <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-vs-javascript\/#typing-of-variables\">dynamisch niet gedeclareerde class-properties instellen en opvragen<\/a>. Bijvoorbeeld:<\/p>\n<pre><code class=\"language-php\">class Post {\n    private int $pid;\n}\n\n$post = new Post();\n$post-&gt;name = 'Kinsta';<code class=\"language-php\"><\/code><\/code><\/pre>\n<p>Hier declaret de class <code>Post<\/code> geen property <code>name<\/code>. Maar omdat PHP dynamische properties toestaat, kun je die instellen buiten de class-declaratie om. Dat is het grootste &#8211; en mogelijk enige &#8211; voordeel.<\/p>\n<p>Dynamische properties zorgen voor onverwachte bugs en gedrag in je code. Als je bijvoorbeeld een fout maakt bij het declareren van een class-property buiten de class, kun je die gemakkelijk uit het oog verliezen &#8211; vooral bij het debuggen van fouten binnen die class.<\/p>\n<p>Vanaf PHP 8.2 zijn <a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_dynamic_properties\">dynamische properties afgeschreven<\/a>. Het instellen van een waarde op een niet gedeclareerde class-property zal de eerste keer dat de property wordt ingesteld een afschrijvingsmelding geven.<\/p>\n<pre><code class=\"language-php\">class Foo {}\n$foo = new Foo;\n\n\/\/ Deprecated: Creation of dynamic property Foo::$bar is deprecated\n$foo-&gt;bar = 1;\n\n\/\/ No deprecation warning: Dynamic property already exists.\n$foo-&gt;bar = 2;<code class=\"language-php\"><\/code><\/code><\/pre>\n<p>Echter, vanaf PHP 9.0 zal het instellen ervan een <code>ErrorException<\/code> foutmelding geven.<\/p>\n<p>Als je code vol zit met dynamische properties &#8211; en dat is veel PHP code &#8211; en als je deze depreciatiemeldingen wilt stoppen na een upgrade naar PHP 8.2, kun je het nieuwe attribuut <code>#[AllowDynamicProperties]<\/code> van PHP 8.2 gebruiken om dynamische properties bij classes toe te staan.<\/p>\n<pre><code class=\"language-php\">#[AllowDynamicProperties]\nclass Pets {}\nclass Cats extends Pets {}\n\n\/\/ You'll get no deprecation warning\n$obj = new Pets;\n$obj-&gt;test = 1;\n\n\/\/ You'll get no deprecation warning for child classes\n$obj = new Cats;\n$obj-&gt;test = 1;<\/code><\/pre>\n<p>Volgens de RFC kunnen classes die gemarkeerd zijn als <code>#[AllowDynamicProperties]<\/code>, evenals hun childclasses, dynamische properties blijven gebruiken zonder afschrijving of verwijdering.<\/p>\n<p>Je moet ook weten dat in PHP 8.2 de enige gebundelde class die gemarkeerd is als <code>#[AllowDynamicProperties]<\/code> de <code>stdClass<\/code> is. Verder worden properties die benaderd worden via <code>__get()<\/code> of <code>__set()<\/code> <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.magic.php\">PHP magische methoden<\/a> niet beschouwd als dynamische properties, zodat ze geen depreciatiemelding krijgen.<\/p>\n<h3>Gedeeltelijk ondersteunde callables afschrijven<\/h3>\n<p>Een andere wijziging in PHP 8.2, zij het met een meer verwaarloosbaar effect, is het <a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_partially_supported_callables\">afschrijven van gedeeltelijk ondersteunde callables<\/a>.<\/p>\n<p>Deze callables worden gedeeltelijk ondersteund genoemd omdat je ze niet direct kunt gebruiken via <code>$callable()<\/code>. Je kunt ze alleen bereiken met de functie <code>call_user_func($callable)<\/code>. De lijst van zulke callables is niet lang:<\/p>\n<pre><code class=\"language-php\">\"self::method\"\n\"parent::method\"\n\"static::method\"\n[\"self\", \"method\"]\n[\"parent\", \"method\"]\n[\"static\", \"method\"]\n[\"Foo\", \"Bar::method\"]\n[new Foo, \"Bar::method\"]<\/code><\/pre>\n<p>Vanaf PHP 8.2 zal elke poging om zulke callables aan te roepen &#8211; zoals via <code>call_user_func()<\/code> of <code>array_map()<\/code> functies &#8211; een deprecatiewaarschuwing geven.<\/p>\n<p>De oorspronkelijke RFC geeft een goede reden voor deze deprecatie:<\/p>\n<blockquote><p><em>Afgezien van de laatste twee gevallen zijn al deze callables contextafhankelijk. Naar welke methode <code>\"self::method\"<\/code> verwijst hangt af van de class van waaruit de call of de controle van de callabiliteit wordt uitgevoerd. In de praktijk geldt dit meestal ook voor de laatste twee gevallen, bij gebruik in de vorm van <code>[new Foo, \"parent::method\"]<\/code>.<\/em><\/p>\n<p><em>Het verminderen van de context-dependency van callables is het secundaire doel van deze RFC. Na deze RFC is de enige overgebleven scope-dependency de zichtbaarheid van methoden: <code>\"Foo::bar\"<\/code> kan zichtbaar zijn in de ene scope, maar niet in een andere. Als callables in de toekomst beperkt zouden worden tot publieke methoden (terwijl private methoden eersteklas callables of <code>Closure::fromCallable()<\/code> zouden moeten gebruiken om scope-onafhankelijk te worden), dan zou het type callable goed gedefinieerd worden en gebruikt kunnen worden als een propertystype. <\/em><em>Veranderingen in de handling van zichtbaarheid worden echter niet voorgesteld als onderdeel van deze RFC.<\/em><\/p><\/blockquote>\n<p>Volgens de oorspronkelijke RFC zullen de <code>is_callable()<\/code> functie en het <code>callable<\/code> type deze callables blijven accepteren als uitzonderingen. Maar alleen totdat de ondersteuning ervoor vanaf PHP 9.0 geheel wordt verwijderd.<\/p>\n<p>Om verwarring te voorkomen is de reikwijdte van deze deprecation notice <a href=\"https:\/\/wiki.php.net\/rfc\/partially-supported-callables-expand-deprecation-notices\">uitgebreid met een nieuwe RFC<\/a> &#8211; het bevat nu ook deze exceptions.<\/p>\n<p>Het is goed om te zien dat PHP evolueert naar een goed gedefinieerd <code>callable<\/code> type.<\/p>\n<h3>Afschrijving <code>#utf8_encode()<\/code> en <code>utf8_decode()<\/code> functies<\/h3>\n<p>PHP&#8217;s ingebouwde functies <code>utf8_encode()<\/code> en <code>utf8_decode()<\/code> converteren strings gecodeerd in ISO-8859-1 (&#8220;Latin 1&#8221;) naar en van UTF-8.<\/p>\n<p>Hun namen suggereren echter een algemener gebruik dan hun implementatie toelaat. De &#8220;Latin 1&#8221; codering wordt vaak verward met andere coderingen zoals de &#8220;Windows Code Page 1252&#8221;<\/p>\n<p>Verder zie je meestal <a href=\"https:\/\/en.wikipedia.org\/wiki\/Mojibake\">Mojibake<\/a> als deze functies een string niet goed kunnen converteren. Het ontbreken van foutmeldingen betekent ook dat het moeilijk is ze te herkennen, vooral in een zee van anders leesbare tekst.<\/p>\n<p>PHP 8.2 <a href=\"https:\/\/wiki.php.net\/rfc\/remove_utf8_decode_and_utf8_encode\">deprecieert de functies <code>#utf8_encode()<\/code> en <code>utf8_decode()<\/code> af<\/a>. Als je ze callt, zie je deze deprecatiemeldingen:<\/p>\n<pre><code class=\"language-php\">Deprecated: Function utf8_encode() is deprecated\nDeprecated: Function utf8_decode() is deprecated<\/code><\/pre>\n<p>De RFC stelt voor om in plaats daarvan <a href=\"https:\/\/kinsta.com\/nl\/blog\/installeer-php\/#all-about-php-extensions\">PHP&#8217;s ondersteunde extensies<\/a> als <code>mbstring<\/code>, <code>iconv<\/code>, en <code>intl<\/code> te gebruiken.<\/p>\n<h3>Afschrijven<code>${}<\/code> string-interpolatie<\/h3>\n<p>PHP staat het inbedden van variabelen in strings met dubbele aanhalingstekens (<code>\"<\/code>) en heredoc (<code>&lt;&lt;&lt;<\/code>) op verschillende manieren toe:<\/p>\n<ol>\n<li>Variabelen direct insluiten &#8211; Met accolades <code>\u201c$foo\u201d<\/code><\/li>\n<li>Met accolades buiten de variabele &#8211; <code>\u201c{$foo}\u201d<\/code><\/li>\n<li>Met accolades na het dollarteken &#8211; Met accolades na het dollarteken <code>\u201c${foo}\u201d<\/code><\/li>\n<li>Variabele variabelen &#8211; <code>\u201c${expr}\u201d<\/code> &#8211; equivalent aan het gebruik van <code>(string) ${expr}<\/code><\/li>\n<\/ol>\n<p>De eerste twee manieren hebben hun voor- en nadelen, terwijl de laatste twee een complexe en tegenstrijdige syntaxis hebben. PHP 8.2 <a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_dollar_brace_string_interpolation\">schrijft de laatste twee manieren van string-interpolatie af<\/a>.<\/p>\n<p>Je kunt voortaan geen strings meer op deze manier interpoleren:<\/p>\n<pre><code class=\"language-php\">\"Hello, ${world}!\";\nDeprecated: Using ${} in strings is deprecated\n\n\"Hello, ${(world)}!\";\nDeprecated: Using ${} (variable variables) in strings is deprecated<\/code><\/pre>\n<p>Vanaf PHP 9.0 krijg je bij het gebruik hiervan in plaats daarvan een exception error.<\/p>\n<h3>Afschrijving mbstring functies voor Base64\/QPrint\/Uuencode\/HTML entiteiten<\/h3>\n<p>PHP&#8217;s mbstring (multi-byte string) functies helpen ons te werken met Unicode, HTML entiteiten en andere oude tekstcoderingen.<\/p>\n<p>Base64, Uuencode en QPrint zijn echter geen tekstcoderingen en zijn nog steeds onderdeel van deze functies &#8211; voornamelijk om te zorgen dat oudere system ook nog functioneren. PHP bevat daarnaast aparte implementaties van deze coderingen.<\/p>\n<p>Voor HTML-entiteiten heeft PHP ingebouwde functies &#8211; <code>htmlspecialchars()<\/code> en <code>htmlentities()<\/code> &#8211; om daar beter mee om te gaan. In tegenstelling tot mbstring zullen deze functies bijvoorbeeld ook <code>&lt;<\/code>. <code>&gt;<\/code>, en <code>&<\/code> karakters om naar HTML entiteiten.<\/p>\n<p>Bovendien verbetert PHP steeds zijn ingebouwde functies &#8211; <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-8-1\/#html-encoding-and-decoding-functions-now-use-ent_quotes--ent_substitute\">net als PHP 8.1 met HTML coderings- en decoderingsfuncties<\/a>.<\/p>\n<p>Dus, met dat alles in gedachten, <a href=\"https:\/\/github.com\/php\/php-src\/commit\/9308974f8cc6c1046f228be5320fe067913ba987\">schrijft PHP 8.2 het gebruik van mbstring voor deze coderingen af<\/a> (de labels zijn hoofdletter-ongevoelig):<\/p>\n<ul>\n<li>BASE64<\/li>\n<li>UUENCODE<\/li>\n<li>HTML-ENTITIES<\/li>\n<li>html (alias van HTML-ENTITIES)<\/li>\n<li>Geciteerd-afdrukbaar<\/li>\n<li>qprint (alias van Quoted-Printable)<\/li>\n<\/ul>\n<p>Vanaf PHP 8.2 zal het gebruik van mbstring voor het coderen\/decoderen van het bovenstaande een deprecatiemelding geven. PHP 9.0 zal de mbstring ondersteuning voor deze coderingen helemaal verwijderen.<\/p>\n<h2>Andere kleine veranderingen in PHP 8.2<\/h2>\n<p>Tenslotte kunnen we de kleine veranderingen van PHP 8.2 bespreken, waaronder de verwijderde properties en functies.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"15\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Ondersteuning voor libmysql uit mysqli verwijderd<\/h3>\n<p>Vanaf nu staat PHP zowel <code>mysqli<\/code> als <code>PDO_mysql<\/code> drivers toe om te bouwen tegen <code>mysqlnd<\/code> en <code>libmysql<\/code> libraries. Het standaard en aanbevolen stuurprogramma sinds PHP 5.4 is echter <code>mysqlnd<\/code>.<\/p>\n<p>Beide drivers hebben veel voor- en nadelen. Echter, het verwijderen van ondersteuning voor een van hen &#8211; idealiter <a href=\"https:\/\/wiki.php.net\/rfc\/mysqli_support_for_libmysql\"><code>libmysql<\/code><\/a> omdat het niet de standaard is &#8211; zal de code en eenheidstesten van PHP vereenvoudigen.<\/p>\n<p>Om een case voor deze verwijdering te maken, somt de RFC vele voordelen van <code>mysqlnd<\/code> op:<\/p>\n<ul>\n<li>Het is gebundeld met PHP<\/li>\n<li>Het gebruikt PHP geheugenbeheer om het geheugengebruik te controleren en<br \/>\n<a href=\"https:\/\/kinsta.com\/nl\/blog\/prestaties-laravel\/\">prestaties te verbeteren<\/a><\/li>\n<li>Biedt quality-of-life functies (bijv. <code>get_result()<\/code>)<\/li>\n<li>Geeft numerieke waarden terug met behulp van PHP native types<\/li>\n<li>De functionaliteit is niet afhankelijk van de externe bibliotheek<\/li>\n<li>Optionele plugin-functionaliteit<\/li>\n<li>Ondersteunt asynchrone queries<\/li>\n<\/ul>\n<p>De RFC noemt ook enkele voordelen van <code>libmysql<\/code>, waaronder:<\/p>\n<ul>\n<li>Auto-reconnect is mogelijk ( <code>mysqlnd<\/code> ondersteunt deze functionaliteit expres niet omdat er gemakkelijk misbruik van gemaakt kan worden)<\/li>\n<li>LDAP- en SASL-authenticatiemodi (<code>mysqlnd<\/code> <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6447\">voegt deze functie mogelijk binnenkort ook toe<\/a>)<\/li>\n<\/ul>\n<p>Daarnaast noemt de RFC veel nadelen van <code>libmysql<\/code> &#8211; incompatibiliteit met het PHP geheugenmodel, veel falende tests, geheugenlekken, verschillende functionaliteiten tussen versies, enz.<\/p>\n<p>Met dit alles in gedachten verwijderde PHP 8.2 de ondersteuning voor het bouwen van <code>mysqli<\/code> tegen <code>libmysql<\/code>.<\/p>\n<p>Als je een functionaliteit wilt toevoegen die alleen beschikbaar is met <code>libmysql<\/code>, moet je die expliciet toevoegen aan<code> mysqlnd<\/code> als een verzoek om een functie. Je kunt ook geen auto-reconnect toevoegen.<\/p>\n<h3>Locale-onafhankelijke case<\/h3>\n<p>Voor <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-8\/\">PHP 8.0<\/a> werd de locale van PHP ge\u00ebrfd van de systeemomgeving. Maar dit kon in sommige randgevallen een probleem opleveren.<\/p>\n<p>Het instellen van de taal tijdens de installatie van Linux stelt de juiste gebruikersinterfacetaal in voor <a href=\"https:\/\/kinsta.com\/nl\/blog\/linux-opdrachten\/\">de ingebouwde commando&#8217;s<\/a>. Het verandert echter ook onverwacht hoe de stringafhandeling van de C bibliotheek werkt.<\/p>\n<p>Als je bijvoorbeeld de taal &#8220;Turks&#8221; of &#8220;Kazachs&#8221; hebt gekozen tijdens de installatie van Linux, zul je merken dat het aanroepen van <code>toupper('i')<\/code> om het equivalent in hoofdletters te krijgen, de <a href=\"https:\/\/www.wikiwand.com\/en\/%C4%B0\">gestippelde hoofdletter I<\/a> oplevert (U+0130, <code>\u0130<\/code>).<\/p>\n<p>PHP 8.0 heeft deze anomalie gestopt door de standaard locale op &#8220;C&#8221; te zetten, tenzij de gebruiker dit expliciet verandert via <code>setlocale()<\/code>.<\/p>\n<p>PHP 8.2 gaat nog verder door <a href=\"https:\/\/wiki.php.net\/rfc\/strtolower-ascii\">de locale gevoeligheid voor hoofdletterconversies weg te nemen<\/a>. Deze RFC wijzigt voornamelijk <code>strtolower()<\/code>, <code>strtoupper()<\/code>, en verwante functies. Lees de RFC voor een lijst van alle betrokken functies.<\/p>\n<p>Als alternatief kun je, als je gelokaliseerde case conversie wilt gebruiken, <code>mb_strtolower()<\/code> gebruiken.<\/p>\n<h3>Verbetering van de random extensie<\/h3>\n<p>PHP is van plan <a href=\"https:\/\/wiki.php.net\/rfc\/rng_extension\">zijn random functionaliteit te herzien<\/a>.<\/p>\n<p>Op dit moment is PHP&#8217;s random functionaliteit sterk afhankelijk van de <a href=\"https:\/\/en.wikipedia.org\/wiki\/Mersenne_Twister\">Mersenne Twister state<\/a>. Deze state wordt echter impliciet opgeslagen in PHP&#8217;s globale gebied &#8211; een gebruiker kan er op geen enkele manier bij. Het toevoegen van randomisatiefuncties tussen de eerste fase van het zaaien en het bedoelde gebruik zou de code breken.<\/p>\n<p>Het onderhouden van zulke code kan nog ingewikkelder zijn wanneer je code gebruik maakt van externe pakketten.<\/p>\n<p>De huidige random functionaliteit van PHP kan dus geen willekeurige waarden consistent reproduceren. Hij faalt zelfs in empirische statistische tests van uniforme willekeurige getallengeneratoren, zoals <a href=\"http:\/\/simul.iro.umontreal.ca\/testu01\/tu01.html\">TestU01&#8217;s Crush en BigCrush<\/a>. De 32-bits beperking van Mersenne Twister maakt dat nog erger.<\/p>\n<p>Het gebruik van PHP&#8217;s ingebouwde functies &#8211; <code>shuffle()<\/code>, <code>str_shuffle()<\/code>, <code>array_rand()<\/code> &#8211; is dus niet aan te raden als je cryptografisch veilige willekeurige getallen nodig hebt. In zulke gevallen zul je een nieuwe functie moeten implementeren met behulp van <code>random_int()<\/code> of soortgelijke functies.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/random_extension_improvement\">Verschillende problemen met deze RFC<\/a> werden echter naar voren gebracht nadat het stemmen was begonnen. Deze tegenslag dwong het PHP team om alle problemen in een aparte RFC te noteren, met een stemoptie voor elk probleem. Pas na het bereiken van een consensus zullen ze besluiten om verder te gaan.<\/p>\n<h2>Extra RFC&#8217;s in PHP 8.2<\/h2>\n<p>PHP 8.2 bevat ook veel nieuwe functies en kleine veranderingen. We noemen ze hieronder met links naar aanvullende bronnen:<\/p>\n<ol>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/pull\/8720\">Nieuwe <code>curl_upkeep<\/code> functie<\/a>: PHP 8.2 voegt deze nieuwe functie toe aan zijn Curl-extensie. Hij callt de functie <code>curl_easy_upkeep()<\/code> in libcurl, de onderliggende C-bibliotheek die de PHP Curl-extensie gebruikt.<\/li>\n<li><a href=\"https:\/\/php.watch\/versions\/8.2\/ini_parse_quantity\">Nieuwe <code>ini_parse_quantity<\/code> functie<\/a>: PHP INI directives accepteren gegevensgroottes met een vermenigvuldigingsachtervoegsel. Je kunt bijvoorbeeld 25 Megabyte schrijven als <code>25M<\/code>, of 42 Gigabyte als gewoon <code>42G<\/code>. Deze suffixen komen veel voor in PHP INI bestanden, maar zijn elders ongewoon. Deze nieuwe functie parseert de <a href=\"https:\/\/kinsta.com\/nl\/blog\/verhoog-maximale-uploadgrootte-wordpress\/#create-or-modify-the-phpini-file\">PHP INI waarden<\/a> en geeft hun gegevensgrootte in bytes.<\/li>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/pull\/8151\/files\">Nieuwe <code>memory_reset_peak_usage<\/code> functie<\/a>: Deze functie reset het piekgeheugengebruik dat de functie <code>memory_get_peak_usage<\/code> teruggeeft. Dit kan handig zijn als je dezelfde actie meerdere keren uitvoert en het piekgeheugengebruik van elke keer wilt bijhouden.<\/li>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/pull\/7583\">Ondersteuning voor no-capture modifier (<code>\/n<\/code>) in <code>preg_*<\/code> functies<\/a>: In regex geven de metacharacters <code>()<\/code> een catch groep aan. Dat betekent dat alle overeenkomsten voor de expressions binnen het haakje worden geretourneerd. PHP 8.2 voegt een no-capture modifier (<code>\/n<\/code>) toe om dit gedrag te stoppen.<\/li>\n<li><a href=\"https:\/\/wiki.php.net\/rfc\/iterator_xyz_accept_array\">Laat de <code>iterator_*()<\/code> familie alle iterables accepteren<\/a>: Op dit moment accepteert PHP&#8217;s <code>iterator_*()<\/code> familie alleen <code>Traversables<\/code> (dus geen gewone arrays toegestaan). Dat is onnodig beperkend, en deze RFC lost dat op.<\/li>\n<\/ol>\n<h2>Samenvatting<\/h2>\n<p>PHP 8.2 bouwt voort op de enorme verbeteringen in PHP 8.0 en PHP 8.1, en dat is geen gemakkelijke opgave. De meest spannende functies van PHP 8.2 zijn volgens ons de nieuwe standalone types, readonly properties en talrijke prestatieverbeteringen.<\/p>\n<p>We kunnen niet wachten om PHP 8.2 te <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-benchmarks\/\">benchmarken<\/a> met verschillende <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-frameworks\/\">PHP frameworks<\/a> en <a href=\"https:\/\/kinsta.com\/nl\/wordpress-marktaandeel\/\">CMS&#8217;en<\/a>.<\/p>\n<p>Zorg ervoor dat je deze blogpost bladwijzert voor toekomstig gebruik.<\/p>\n<p><em>Welke functies van PHP 8.2 zijn jouw favoriet? Welke afschrijvingen zijn je minst favoriete? Deel je gedachten met onze community in de comments!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>PHP 8.2 bouwt voort op de vernieuwde basis van PHP 8.0 en PHP 8.1. Nu PHP 8.2 is uitgebracht zullen we in detail bespreken wat er &#8230;<\/p>\n","protected":false},"author":117,"featured_media":46024,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[867],"class_list":["post-45806","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","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 is er nieuw in PHP 8.2 \u2014 Nieuwe functies, afschrijvingen, veranderingen en meer<\/title>\n<meta name=\"description\" content=\"PHP 8.2. is uitgebracht. Ontdek alle nieuwe features, verbeteringen, deprecaties en kleine wijzigingen van de release.\" \/>\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-2\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Wat is er nieuw in PHP 8.2 - Nieuwe functies, afschrijvingen, veranderingen en meer\" \/>\n<meta property=\"og:description\" content=\"PHP 8.2. is uitgebracht. Ontdek alle nieuwe features, verbeteringen, deprecaties en kleine wijzigingen van de release.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/\" \/>\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=\"2022-09-20T08:30:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-15T12:29:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/09\/php-8-2.png\" \/>\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\/png\" \/>\n<meta name=\"author\" content=\"Salman Ravoof\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"PHP 8.2. is uitgebracht. Ontdek alle nieuwe features, verbeteringen, deprecaties en kleine wijzigingen van de release.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/09\/php-8-2.png\" \/>\n<meta name=\"twitter:creator\" content=\"@salmanravoof\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_NL\" \/>\n<meta name=\"twitter:label1\" content=\"Geschreven door\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salman Ravoof\" \/>\n\t<meta name=\"twitter:label2\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 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-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"Wat is er nieuw in PHP 8.2 &#8211; Nieuwe functies, afschrijvingen, veranderingen en meer\",\"datePublished\":\"2022-09-20T08:30:59+00:00\",\"dateModified\":\"2023-06-15T12:29:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/\"},\"wordCount\":3219,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/09\/php-8-2.png\",\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/\",\"url\":\"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/\",\"name\":\"Wat is er nieuw in PHP 8.2 \u2014 Nieuwe functies, afschrijvingen, veranderingen en meer\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/09\/php-8-2.png\",\"datePublished\":\"2022-09-20T08:30:59+00:00\",\"dateModified\":\"2023-06-15T12:29:46+00:00\",\"description\":\"PHP 8.2. is uitgebracht. Ontdek alle nieuwe features, verbeteringen, deprecaties en kleine wijzigingen van de release.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/09\/php-8-2.png\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/09\/php-8-2.png\",\"width\":1460,\"height\":730,\"caption\":\"Wat is er nieuw in PHP 8.2 \u2014 Nieuwe functies, afschrijvingen, veranderingen en meer\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/#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 is er nieuw in PHP 8.2 &#8211; Nieuwe functies, afschrijvingen, veranderingen en meer\"}]},{\"@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\/9cafd2eedd617e640eeea4cf3a5fd987\",\"name\":\"Salman Ravoof\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"caption\":\"Salman Ravoof\"},\"description\":\"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.\",\"sameAs\":[\"https:\/\/salmanravoof.com\",\"https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/\",\"https:\/\/x.com\/salmanravoof\"],\"url\":\"https:\/\/kinsta.com\/nl\/blog\/author\/salmanravoof\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Wat is er nieuw in PHP 8.2 \u2014 Nieuwe functies, afschrijvingen, veranderingen en meer","description":"PHP 8.2. is uitgebracht. Ontdek alle nieuwe features, verbeteringen, deprecaties en kleine wijzigingen van de release.","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-2\/","og_locale":"nl_NL","og_type":"article","og_title":"Wat is er nieuw in PHP 8.2 - Nieuwe functies, afschrijvingen, veranderingen en meer","og_description":"PHP 8.2. is uitgebracht. Ontdek alle nieuwe features, verbeteringen, deprecaties en kleine wijzigingen van de release.","og_url":"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","article_published_time":"2022-09-20T08:30:59+00:00","article_modified_time":"2023-06-15T12:29:46+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/09\/php-8-2.png","type":"image\/png"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"PHP 8.2. is uitgebracht. Ontdek alle nieuwe features, verbeteringen, deprecaties en kleine wijzigingen van de release.","twitter_image":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/09\/php-8-2.png","twitter_creator":"@salmanravoof","twitter_site":"@Kinsta_NL","twitter_misc":{"Geschreven door":"Salman Ravoof","Geschatte leestijd":"18 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"Wat is er nieuw in PHP 8.2 &#8211; Nieuwe functies, afschrijvingen, veranderingen en meer","datePublished":"2022-09-20T08:30:59+00:00","dateModified":"2023-06-15T12:29:46+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/"},"wordCount":3219,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/09\/php-8-2.png","inLanguage":"nl-NL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/nl\/blog\/php-8-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/","url":"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/","name":"Wat is er nieuw in PHP 8.2 \u2014 Nieuwe functies, afschrijvingen, veranderingen en meer","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/09\/php-8-2.png","datePublished":"2022-09-20T08:30:59+00:00","dateModified":"2023-06-15T12:29:46+00:00","description":"PHP 8.2. is uitgebracht. Ontdek alle nieuwe features, verbeteringen, deprecaties en kleine wijzigingen van de release.","breadcrumb":{"@id":"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/nl\/blog\/php-8-2\/"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/#primaryimage","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/09\/php-8-2.png","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/09\/php-8-2.png","width":1460,"height":730,"caption":"Wat is er nieuw in PHP 8.2 \u2014 Nieuwe functies, afschrijvingen, veranderingen en meer"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/nl\/blog\/php-8-2\/#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 is er nieuw in PHP 8.2 &#8211; Nieuwe functies, afschrijvingen, veranderingen en meer"}]},{"@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\/9cafd2eedd617e640eeea4cf3a5fd987","name":"Salman Ravoof","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","caption":"Salman Ravoof"},"description":"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.","sameAs":["https:\/\/salmanravoof.com","https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/","https:\/\/x.com\/salmanravoof"],"url":"https:\/\/kinsta.com\/nl\/blog\/author\/salmanravoof\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/45806","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\/117"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/comments?post=45806"}],"version-history":[{"count":12,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/45806\/revisions"}],"predecessor-version":[{"id":48770,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/45806\/revisions\/48770"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/45806\/translations\/en"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/45806\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/45806\/translations\/fr"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/45806\/translations\/it"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/45806\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/45806\/translations\/es"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/45806\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/45806\/translations\/nl"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/45806\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/45806\/translations\/se"},{"href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/45806\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media\/46024"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media?parent=45806"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/tags?post=45806"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/topic?post=45806"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}