Was ist neu in PHP 8: Alles, was Sie wissen müssen!
Veröffentlicht: 2021-01-06Wir werden uns am 26. November 2020 mit PHP8 in Verbindung setzen , und sicherlich wird viel über die kommenden Funktionen in dieser geschätzten Version geschrieben.
Da es sich um eine Hauptversion handelt, wird es bahnbrechende Änderungen und neue Funktionen geben, und es ist wichtig, sich darüber im Klaren zu sein, was sich alles ändert. Es macht es bequem, darüber nachzudenken, wie sich PHP8 auf Ihre Apps auswirkt und welche Maßnahmen ergriffen werden müssen, um sicherzustellen, dass Sie bequem und ohne Zwischenfälle upgraden können.
Wir sind einige der wichtigsten Änderungen durchgegangen, um herauszufinden, was wir in der nächsten PHP-Version bekommen werden und was es wert ist, kritisiert zu werden.
Beginnen wir mit der Übersicht!
Überblick über PHP 8
Wie oben erwähnt, führt PHP 8 ein Paket mit neuen Features, Verbesserungen, Funktionen und veralteten Funktionen in die Sprache ein. Unter all diesen ist das am meisten diskutierte Feature der JIT-Compiler. Allerdings verdienen leistungsverbessernde Funktionen wie JIT das Rampenlicht, aber die syntaktischen Verbesserungen werden voraussichtlich eher ein echter Knaller für PHP-Praktizierende sein, würden wir sagen, „zumindest kurzfristig“.
Eine Geschichte des Wandels
Ein paar PHP-Änderungen werden in kurzer Zeit vorgeschlagen, diskutiert, implementiert und weiter genehmigt. Sie sind beliebt, unumstritten und haben eine natürliche Methode, sie umzusetzen.
Und danach kommen diejenigen, die versucht werden, scheitern und mehrmals zurückkehren, bevor wir sie schließlich akzeptieren. Manchmal dauert es lange, bis die Umsetzung geklärt ist, und manchmal ist die Idee selbst nur halb ausgereift, und manchmal ist die Community selbst noch nicht mit der Idee warm geworden – „es ist noch nicht an der Zeit“.
Credits fallen direkt in die Kategorie Typ. Sie wurden erstmals im Jahr 2016 für PHP 7.1 vorgeschlagen. Sie stießen jedoch auf hartnäckigen Widerstand und verloren die Annahmeabstimmung deutlich. Nun, vier Jahre später, und ein ziemlich ähnlicher, wenn auch etwas eingeschränkter Vorschlag, der mit nur einem Andersdenkenden durchkam. Offenbar eine Idee, deren Zeit sicherlich gekommen ist!
Was sind die Probleme mit dem alten Code?
Da PHP 8 eine riesige neue Version ist, sollten wir damit rechnen, dass alter Code nicht mehr kompatibel ist. Allerdings wurden die meisten Änderungen, die zu Komplikationen führen könnten, bereits in den Versionen 7.2 , 7.3 und 7.4 übermittelt . Lassen Sie uns jetzt über die letzten Änderungen sprechen. Sie sind:
Magic zitiert Vermächtnis
- Der wahre Typ
- FILTER_SANITIZE_MAGIC_QUOTES -Filter
- Entbindung von $this von nicht statischen Closures
- array_key_exists() mit Objekten
- mb_strrpos() mit Codierung als 3. Argument
- Reflection export()- Methoden
- convert_cyr_string()- Funktion
- implode() Parameterreihenfolge mix
- restore_include_path()- Funktion
- hebrevc()- Funktion
- Funktion money_format()
- allow_url_include INI-Direktive
- ezmlm_hash()- Funktion
Neue Funktionen in PHP 8
str_enthält
Wenn eine Zeichenfolge eine andere enthält, gibt es zahlreiche Möglichkeiten, dies herauszufinden.
Im Allgemeinen verwenden Sie strpos(). Wie Sie wissen, nimmt strpos() einen Heuhaufen neben die Nadel, nach der Sie suchen möchten. Es gibt eine Ganzzahl zurück, die die erste Position anzeigt, an der Sie die Nadel sehen.
Jetzt, da es die Position eines Strings in einem anderen zurückgibt, können Sie einfach nicht prüfen, ob strpos() es entdeckt hat oder nicht; Wenn es „0“ zurückgibt (Positionen sind nullindiziert und beginnen mit 0 und nicht mit 1), dann behandelt die Bedingung sie als falschen Wert und zeigt an, dass sie nicht gefunden wurde.
Was bedeutet das?
Sie müssen die Bedingung „strpos($haystack, $needle) !== false“ schreiben. False gibt an, dass die Position der Zeichenfolge nicht gefunden werden konnte. Dies ist eine intransparente und esoterische Methode, um eine Zeichenfolge in einer Zeichenfolge zu suchen! Nun, nicht so verwirrend.
Um dies zu vermeiden, bringt PHP 8 str_contains() mit. Die Aufgabe von str_contains() besteht darin, einen einfachen booleschen Wert zurückzugeben, der anzeigt, ob die Nadel im Heuhaufen vorhanden ist oder nicht. Das ist viel einfacher zu schreiben, außerdem als jemand zu verstehen, der den Code pflegt, oder?
if (str_contains( 'Foo Bar Baz' , 'Foo' )) { // FOUND }
PHP 8: Engine-Funktionen und -Änderungen
Es gibt einige neue Engine-Features und Änderungen, die in PHP 8 festgestellt wurden. Das wichtigste Feature ist zweifellos der neue JIT-Compiler.
JIT-Compiler
- LSP-Durchsetzung
- Schwerwiegende Fehler bei inkompatiblen Methodensignaturen
- Ressource „Klassen“
- XML-RPC ist jetzt in PECL
- Behauptungsverhalten
- Reflexion ändert sich
Aus Gründen des Kernzwecks dieses Blogs konzentrieren wir uns auf den JIT-Compiler, Ressourcen-„Klassen“ und schließlich auf die Änderungen der Reflection-API.
Just-In-Time-Compiler ( RFC )
Aufgrund von Geschwindigkeitsverbesserungen, die vor der Veröffentlichung von PHP7 vorgenommen wurden, fand die Geburt des Just-In-Time (oder JIT) Compilers statt. Es wird in PHP8 eingeführt, weil es fast keine Geschwindigkeitsverbesserungen mehr gibt, die ohne die Verwendung eines JIT erreicht werden können. Die Idee ist, dass es die PHP-Leistung verbessern wird.
PHP-Code wird bei der Ausführung in Bytecodes übersetzt, und diese Bytecodes werden weiter verwendet, um die Schritte im Programm auszuführen.
PHP analysiert den von Ihnen ausgeführten Code, das bedeutet JIT. Darüber hinaus kann es andere Echtzeitentscheidungen als Leistungsverbesserungen am Code treffen, während Sie ihn ausführen. Es wird in CPU-intensiven Anwendungen sehr gut einsetzbar sein und nicht nur in webbasierten Szenarien.
Dies spiegelt wider, dass serverseitige PHP-Anwendungen mit dem in PHP integrierten JIT-System sicherlich häufiger vorkommen können.
Sie müssen JIT zuerst aktivieren, wenn Sie es verwenden möchten. Auf unserem Testsystem (Ubuntu 20.04) haben wir bereits das PHP-opcache-Modul installiert, das wir mit dem Core-PHP8-Paket installiert haben. Wir haben in der Datei unter /etc/php/8.0/cli/conf.d/10-opcache.ini konfiguriert.
Jetzt sind Sie bereit, JIT zu aktivieren, richtig?
- Aktivieren Sie den Opcache
Sie können der Einstellung opcache.jit_buffer_size Speicherplatz zuweisen. Ihre Datei wird auf meinem System so angezeigt.
- zend_extension=opcache.so
- opcache.enable_cli=1
- ; Konfiguration für das PHP-Opcache-Modul
- opcache.jit_buffer_size=256M
Verwenden Sie außerdem die Funktion opcache_get_status(), um sicherzustellen, ob sie aktiv ist. Rollen Sie Ihren Blick über den „Jit“-Teil dieses Arrays und erhalten Sie Informationen zum aktuellen Status von JIT.
var_dump(opcache_get_status()['jit']);
Wenn JIT perfekt aktiviert wurde, sollte dies wie unten gezeigt ausgedruckt werden.
- Array(7) {
- [“aktiviert“]=>
- bool (wahr)
- [“ein”]=>
- bool (wahr)
- [„Art“]=>
- int(5)
- [„opt_level“]=>
- int(4)
- [„opt_flags“]=>
- int(6)
- ["Puffergröße"]=>
- int(268435440)
- [„pufferfrei“]=>
- int(268432880)
- }
Also war es schneller? Mit einem Wort, wir würden ein herzliches „Ja“ ausrufen.
Wir haben ein paar Leute bemerkt, die Benchmarks mit Hilfe eines Mandelbrot-Sets durchführen, also haben wir uns entschieden, eine Bibliothek zu verwenden, die wir vor einiger Zeit erstellt haben und die verschiedene Arten von Fraktalen in PHP zeichnet. Alles, was wir getan haben, war, drei Fraktale zu generieren und zu verfolgen, wie lange es mit der Funktion microtome() gedauert hat. Wir haben die Ergebnisse für PHP 7.4.8 unten angezeigt.
- Burningship – 84.20269203186
- Mandelbrot – 21.552599906921
- Dreispitz – 32.685042858124
Als wir denselben Code auf PHP8 ausgeführt haben, war er ziemlich schneller. Die Zahlen werden für sich sprechen. .
- Burningship – 15.272277116776
- Mandelbrot -3.7528541088104
- Dreispitz -4.4957919120789
Diese enorme Geschwindigkeitssteigerung ist ziemlich interessant. Der Code, den wir hier verwendet haben, erzeugt riesige Fraktale, aber wir erinnern uns, dass wir beim Erstellen des Codes die meiste Zeit damit verbracht haben, auf die Generierung von Fraktalen zu warten.
Diese Ergänzung ist für uns interessant, da wir PHP bei einigen Gelegenheiten an seine Grenzen gebracht haben (außerhalb der Generierung von Fraktalen). Wir können feststellen, dass dies ein großer Vorteil für die Zukunft von PHP ist und es ermöglichen wird, die Sprache für Situationen außerhalb der regulären Website-Sprache auszuwählen.
Wir haben uns den Geschwindigkeitszuwachs für Apps wie WordPress oder Drupal nicht angesehen, aber nach dem, was wir gelesen haben, gibt es bei dieser Art von Anwendungen sicherlich kaum einen Unterschied. In Zukunft werden wir Benchmarks auf diesen Plattformen durchführen, um herauszufinden, was für einen Unterschied der JIT dort markiert.
Union-Typen ( RFC )
Seit PHP7 ist die Festlegung, welche Art von Rückgabewerten und Arten von Argumenten und möglich sind. Dadurch kann PHP einen Fehler ausgeben, falls der übergebene Argumenttyp nicht mit dem erwarteten Typ identisch ist. Es ist entscheidend sicherzustellen, dass Funktionen in einer locker typisierten Sprache wie PHP die perfekten Arten von Werten erhalten und produzieren.
In PHP8 ist es nun möglich, verschiedene Sortierungen für die Argumente und Rückgabewerte festzulegen, getrennt durch ein Pipe-Zeichen.
Wir haben unten eine Funktion gezeigt, die entweder einen Float- oder einen Integer-Wert akzeptieren kann.
function addNumbers(int|float $number1, int|float $number2) : int|float { return $number1 + $number2; }
Früher musste eine identische Funktion ohne Typhinweise generiert werden, da PHP den Typ stillschweigend anzeigen konnte, falls das übergebene Argument nicht korrekt war. Das bedeutete, dass, falls wir den Typ des Arguments als Ganzzahl festlegen, PHP alle Float-Werte in eine Ganzzahl umwandeln würde. Es kann sicherlich zu ein paar kniffligen Fehlern führen, die Sie abfangen müssen, falls Sie keine Komponententests durchführen.

Wir nennen es einfach wie jede andere, um die obige Funktion zu verwenden
echo addNumbers(1, 1); // prints 2 echo addNumbers(1.1, 1.1); // prints 2.2
Falls wir versuchen, eine Zeichenfolge an die identische Funktion zu übergeben:
echo addNumbers('one', 'two');
Wir erhalten einen schwerwiegenden PHP-Fehler, der ausruft, dass wir entweder ein Float oder ein „int“ an die Funktion übergeben müssen.
Sie können den Typ void nicht als Union-Typ verwenden, da er festlegt, dass die Funktion nichts zurückgeben wird. Mit einfachen Worten, Sie können nicht ausrufen, dass eine Funktion eine Leerstelle oder eine ganze Zahl zurückgibt; Sie erhalten einen schwerwiegenden PHP-Fehler.
Während eine normale Änderung, die wir sehen können, darin besteht, dass diese Funktion ein wenig genutzt wird, da es früher nur möglich war, verschiedene Arten von Werten in Kommentaren festzulegen, was dazu führte, dass Doc-Block-Kommentare detaillierter wurden als Code.
Der Nullsafe-Operator (RFC)
Neben dem Null-Koaleszenz-Operator ist die Möglichkeit, Null-Rückgabewerte direkt aus Methoden zu erkennen, möglich. Wenn Sie es nicht wussten, können Sie mit dem Null-Koaleszenz-Operator einen Wert abrufen, und Sie müssen nicht testen, ob der Wert vorhanden ist, sondern einen anderen Wert zurückgeben, falls der erste Wert null ist.
Wir können dies also tun, um einen Wert von „$_GET superglobal“ abzurufen. und falls dieser Wert nicht vorhanden ist, dann „0“.
1. $page = $_GET['page'] ?? 0;
2. echo $seite;
Die Funktionsweise des Null-Safe-Operators ist dieselbe, ermöglicht Ihnen jedoch, eine praktische Verknüpfung zu erstellen und auf eine Nullrückgabe von einem Weg zu testen, bevor Sie versuchen, diesen Wert zu verwenden.
Wir haben festgestellt, dass dies letztendlich in Drupal nützlich sein wird, wo wir dazu neigen, einen Großteil des Prüfcodes zu schreiben, um sicherzustellen, dass „Rückgaben von Methoden“ oder „Objekteigenschaften“ Dinge enthalten, bevor wir sie verwenden. Dies ist aufgrund des kontextuellen Zustands der Objekte in Drupal aufgrund der darin enthaltenen Inhalte obligatorisch. Diese Änderung wird sicherlich einige der Prüfungen vereinfachen.
Benannte Argumente ( RFC )
Mit benannten Argumenten können Sie eine andere Reihenfolge von Argumenten festlegen und Funktionen aufrufen. Nehmen Sie die folgende normale Funktion, die zwei Parameter hat. Es füllt ein Array auf die angegebene Länge.
function fillArray(array $arrayToFill, int $number) : array { for ($i = 0 $i < $number; ++$i) { $arrayToFill[$i] =1; } return $arrayToFill; }
Wir können die Argumente in der Anordnung übergeben, in der sie definiert sind, können diese Technik auf normale Weise aufrufen.
$newArray = fillArray([], 2);
Ab PHP8 können Sie nun die Parameter benennen, während Sie sie an die Funktion übergeben. Außerdem können Sie die Parameter in beliebiger Reihenfolge senden.
$newArray = fillArray(number: 2, arrayToFill: []);
Ein normales Beispiel, aber es kann den Code auch besser lesbar machen.
Diese Technik funktioniert mit allen Funktionen in PHP, nicht nur mit benutzerdefinierten. In der PHP-Sprache haben Array- und String-Funktionen nicht identische Reihenfolgen von Parametern. Es ist also eine wirklich willkommene Ergänzung.
Attribute V2 ( RFC1 RFC2 RFC3 )
Attribute stellen einen Mechanismus bereit, um Metadaten an PHP-Klassen, Funktionen, Klasseneigenschaften, Funktionsparameter und Konstanten anzufügen. Auf sie kann nicht direkt über Code zugegriffen werden, und Sie müssen sie mit Hilfe von in PHP integrierten Reflexionsklassen herausziehen.
Die ReflectionClass-Klasse gibt es in PHP seit PHP5; Die Methode getAttribute() ist jedoch neu für PHP8. Diese Methode gibt eine Reihe von ReflectionAttribute-Objekten zurück, die Informationen über Attribute enthalten.
Diese Ergänzung wurde einigen Änderungen unterzogen (wie wir anhand der mehreren RFCs oben erkennen können). Falls Sie die Klasse instanziieren, können Sie die ReflectionClass verwenden und die auf Klassenebene enthaltenen Attributinformationen ausdrucken. In PHP8 gibt es ziemlich viele Attribute, daher empfehlen wir, die RFCs durchzulesen und sich damit vertraut zu machen, was sie eigentlich sind und wie Sie sie in Ihren Code integrieren können.
Übereinstimmungsausdruck ( RFC )
In PHP 8 können wir den neuen Match-Ausdruck mit einer abgekürzten switch-Anweisung vergleichen.
Es sieht ein bisschen wie eine Funktionsdeklaration aus, die einen Wert auf der Grundlage des übergebenen Werts zurückgibt.
Die switch-Anweisung in PHP ist erstaunlich, wenn Sie die Bedingung für den identischen Ausdruck überprüfen möchten, ohne insgesamt mehrere if
-Anweisungen einzuschließen.
Hier bringen wir einen einfachen Wenn-Sonst- Vergleich für einen identischen Ausdruck.
<?php if ($i == 'apple') { echo 'i is apple'; } elseif ($i == 'cake') { echo 'i is cake'; } else { echo 'i is pizza'; }
Und so würde die äquivalente switch
Anweisung unseres vorherigen Beispiels aussehen
<?php switch ($i) { case 'apple': echo 'i is apple'; break; case 'cake': echo 'i is cake'; break; default: echo 'i is pizza'; }
Ressource „Klassen“
Ressourcen-„Klassen“ stehen in der Liste der wichtigsten Änderungen in PHP 8 und dienen als nicht instanziierbarer Ersatz für bestimmte Ressourcentypen. Siehe unten, um zu erfahren, welche Ersatzteile verfügbar sind:
- CurlHandle — curl_init() gibt jetzt CurlHandle zurück und bezieht sich auf eine Curl-Ressource.
- Socket / AddressInfo — Wird von der Sockets-Erweiterung bereitgestellt; Die Anzahl der socket_*()-Funktionen gibt einen Socket zurück, während die socket_address_info_lookup()-Funktion eine AddressInfo-Instanz zurückgibt.
- GdImage — Es stellt eine GD-Ressource dar, wie sie von den zahlreichen imagecreatefrom*()-Funktionen wiederhergestellt wird.
Außerdem ist es wichtig zu beachten, dass Ressourcen nicht durch Funktionen wie curl_close() zerstört werden. Stattdessen müssen Sie die Instanz unset() aufheben, um sie zu dereferenzieren, da sie jetzt eine Klasseninstanz ist.
Sie erhalten die Möglichkeit, die Klassen als Typhinweise in Ihren Funktionen und Methoden anzugeben.
Früher mussten wir Werte untypisiert zurückgeben oder Ressourcenargumente belassen und sie durch Anmerkungen dokumentieren, aber jetzt können Sie explizite Typen haben, und das macht Ihren Code nicht nur lesbarer, sondern auch typsicherer.
Was ist hier der Kompromiss?
Sie müssen jetzt Ihren Code aktualisieren, wenn Sie Ressourcen mithilfe von unset() anstelle der vorherigen Funktionen zerstören möchten, die zum Zerstören von Ressourcen verwendet wurden. Dies kann normalerweise durch Suchen und Ersetzen erreicht werden.
Reflection-API-Änderungen
Eine weitere kleine, aber wichtige Änderung in PHP 8 betrifft die Reflection-API. Während Sie das Attributsystem verwenden, können Sie diese Attribute bequem über die Reflection-API für beliebige Reflection-Klassen abrufen.
Mit dem Hinzufügen von gemischten und Union-Typen sind die ReflectionParameter-Techniken getClass(), isCallable() und isArray() jetzt veraltet.
Das Szenario ist so, weil die Verwendung von getType() viel besser ist und Sie die vollständige Liste der Typen erhalten, die ein bestimmter Parameter erfüllt.
PHP 8-Syntaxverbesserungen
Wie wir feststellen, stiehlt JIT die Schlagzeilen; Die syntaktischen Verbesserungen von PHP 8 bieten PHP-Entwicklern enorme Vorteile für die Lebensqualität.
Unabhängig davon, ob es sich um die Beseitigung gemeinsamer Boilerplates unter den geförderten Konstruktorargumenten oder die verbesserte Ausnahme- und Fehlerbehandlung handelt, es gibt viel, worüber sich Entwickler freuen können.
- „gemischter“ Pseudotyp
- Unionstypen
- Klassenkonstruktor-Eigenschaftsförderung
- Auslösen von Ausnahmen von Ausdrücken
- Attribute
- ::Klassenallgegenwart
- Nur nach Art fangen
- Übereinstimmungsausdrücke
Zur Pflege dieses Blogs konzentrieren wir uns auf Vereinigungstypen, Attribute und Übereinstimmungsausdrücke.
Unionstypen
Union-Typen zeigen, dass ein Wert einer von zwei oder mehr angegebenen Sortierungen ist. Dies geschieht mit einem vertikalen Balken, der zwischen jedem einzelnen zulässigen Typ platziert wird. Für mehrere Entwickler, die sich intensiv mit PHP-Annotationen beschäftigen, um Werte zurückzugeben oder Ihre Parameter anzugeben, haben Sie dies höchstwahrscheinlich bereits getan.
Union-Typen können viel Komplexität und Schwierigkeiten beim Verständnis für diejenigen mit sich bringen, die viele verschiedene Typen akzeptieren oder viele verschiedene Typen zurückgeben.
Dennoch wird dies bei einigen Gelegenheiten sehr nützlich sein. Zum Beispiel für den Fall, dass Sie ein Objekt akzeptieren können, das die neue Stringable-Schnittstelle („string|Stringable“) oder eine Zeichenfolge implementiert, oder wenn Sie entweder ein Objekt akzeptieren können, das die Traversable-Schnittstelle („array|Traversable“) oder ein Array implementiert .
Übereinstimmungsausdrücke
Übereinstimmungsausdrücke unterbrechen das Rätselraten, um herauszufinden, ob das Versäumnis, innerhalb eines bestimmten Schalterfalls zu brechen, beabsichtigt ist oder nicht. Es vereinfacht auch das normale Muster der Zuweisung eines Werts auf der Grundlage einer Übereinstimmung.
Bei Verwendung wird der Wert, den wir an match() übergeben, direkt mit dem Ausdruck auf der linken Seite verglichen. Unabhängig davon, ob es sich um einen Ausdruck oder einen Wert handelt, sollte der Wert, den Sie an match() übergeben, damit übereinstimmen, damit er ausgewählt wird.
Bei Übereinstimmung wird der rechts vorhandene Ausdruck geschätzt und sein Rückgabewert zurückgegeben, während Ausdrücke nur Lambda- oder aufrufbare Funktionen sein können und keine mehrzeiligen Closures zulässig sind.
Attribute
PHP 8 integriert Attribute auch auf Sprachebene. Während Attribute seit mehr als 15 Jahren über Docblock-Anmerkungen vorhanden sind, bietet deren Integration in die Sprache eine bessere Leistung und sicherlich mehr Leistung und mehr Konsistenz. Wir werden wahrscheinlich sehen, dass Attribute bei der Entwicklung von Werkzeugen und schnellen Anwendungen stark genutzt werden.
Fazit
Sicherlich gibt es einige Änderungen in PHP8. Dennoch sieht es so aus, als sei der Großteil des veralteten Codes, der eliminiert wird, für ältere Funktionen bestimmt, die wir in letzter Zeit nicht gesehen haben.
Wir sind sehr gespannt, welche Auswirkungen die JIT-Engine auf die von uns verwendeten Codebasen und auch auf die breitere PHP-Community haben wird – wir empfehlen dringend, Ihre Codebasis auf Inkompatibilitäten mit PHP8 zu scannen und Unit-Tests durchzuführen, um sicherzustellen, dass Ihre PHP Anwendungen einwandfrei funktionieren, bevor Sie „Ja“ zum Upgrade sagen.