Obwohl die neue Version von PHP geringfügig ist, bringt sie bereits viele neue, ohne Übertreibung coole Funktionen sowohl für die Syntax der Sprache als auch für ihre Leistung. Die Liste der Innovationen ist noch nicht endgültig, aber die wichtigsten Änderungen wurden bereits vorgenommen und akzeptiert. Die Veröffentlichung ist für Dezember 2019 geplant.

Wichtige Änderungen für die kommende Version:
- Typisierte Klasseneigenschaften
- Vorspannung für bessere Leistung
- Pfeilfunktionen zum Kurzschreiben anonymer Funktionen
- Zuweisen eines Vereinigungsoperators mit null (?? =)
- Kovarianz / Kontravarianz bei Legacy-Methodensignaturen
- Eine externe Funktionsschnittstelle, die neue Möglichkeiten für die Entwicklung von Erweiterungen in PHP eröffnet
- Operator in Arrays auspacken
Lesen Sie mehr über diese und andere Änderungen unter der Katze.
Haftungsausschluss: In meinen Gesprächen mit Kollegen wurde mehrmals Brents Artikel „ Neu in PHP 7.4 “ vorgestellt. Zuerst wollte ich eine Übersetzung machen, aber dabei wurde mir klar, dass nicht alle neuesten Aktualisierungen im Text angegeben sind und es einige Ungenauigkeiten gibt, so dass dieser Artikel anstelle der Übersetzung erschien.Pfeilfunktionen ( RFC )
Mit den Pfeilfunktionen können Sie anonyme Funktionen kürzer aufzeichnen:
array_map(function (User $user) { return $user->id; }, $users) array_map(fn(User $user) => $user->id, $users)
Einige Merkmale der übernommenen Implementierung von Pfeilfunktionen:
- Sie können auf den
parent
Bereich zugreifen, sodass das Schlüsselwort use nicht verwendet werden muss. $this
auch verfügbar, wie in regulären anonymen Funktionen.- Pfeilfunktionen können nur eine Zeile enthalten, die auch ein Rückgabeoperator ist.
Sie können mehr darüber in diesem
Artikel über Habr lesen.
Typisierte Eigenschaften ( RFC )
Hurra! Klasseneigenschaften können jetzt einen Typhinweis haben. Dies ist eine sehr lang erwartete Änderung seit PHP 7 hin zu einer stärkeren Typisierung der Sprache. Jetzt haben wir alle Grundfunktionen für starkes Tippen. Alle Typen können eingegeben werden, außer
void
und
callable.
class Bar { public string $name; public ?int $amount; public Foo $foo; }
Wenn Sie möchten, dass ich die neuen Möglichkeiten zur Eingabe der Eigenschaften von Objekten genauer betrachte, beachten Sie dies in den Kommentaren und ich werde einen separaten Artikel darüber schreiben!
RFC- Zuweisungsoperator ( RFC ) zuweisen
Anstelle eines so langen Eintrags:
$data['date'] = $data['date'] ?? new DateTime();
Jetzt wird es möglich sein, so zu schreiben:
$data['date'] ??= new DateTime();
Array Unpacking Operator ( RFC )
Jetzt können Sie den Entpack-Operator in Arrays verwenden:
$arrayA = [1, 2, 3]; $arrayB = [4, 5]; $result = [0, ...$arrayA, ...$arrayB, 6 ,7]; <i>// [0, 1, 2, 3, 4, 5, 6, 7]</i>
Bitte beachten Sie, dass dies nur mit nicht assoziativen Arrays funktioniert.
Externe Funktionsschnittstelle ( RFC )
Über die externe Funktionsschnittstelle (FFI) können Sie C-Code direkt in PHP-Code schreiben. Dies bedeutet, dass PHP-Erweiterungen in reinem PHP geschrieben werden können.
Es ist zu beachten, dass dies ein komplexes Thema ist. Sie benötigen noch Kenntnisse in C, um diese Funktionen korrekt verwenden zu können.
Preload ( RFC )
Das Vorladen ist eine großartige Ergänzung des PHP-Kerns, die zu einigen signifikanten Leistungsverbesserungen führen sollte.
Wenn Sie beispielsweise das Framework verwenden, müssen dessen Dateien für jede Anforderung heruntergeladen und neu kompiliert werden. Bei Verwendung von Opcache - Wenn diese Dateien zum ersten Mal an der Verarbeitung einer Anforderung beteiligt sind, werden sie jedes Mal erfolgreich auf Änderungen überprüft. Durch das Vorladen kann der Server die angegebenen PHP-Dateien beim Start in den Speicher laden und sie für alle nachfolgenden Anforderungen ständig verfügbar machen, ohne zusätzliche Überprüfungen auf Dateiänderungen.
Die Leistungsverbesserung ist "nicht kostenlos". Wenn die vorinstallierten Dateien geändert werden, muss der Server neu gestartet werden.
Kovarianz / Kontravarianz bei Legacy-Methodensignaturen ( RFCs )
Derzeit hat PHP hauptsächlich invariante Parametertypen und invariante Rückgabetypen. Mit dieser Änderung können Sie den Typ des Parameters in einen seiner Supertypen ändern. Der zurückgegebene Typ kann wiederum durch seinen Subtyp ersetzt werden. Diese Änderung wird es daher ermöglichen, dem Substitutionsprinzip von Barbara Liskov strenger zu folgen.
Ein Beispiel für die Verwendung eines kovarianten Rückgabetyps:
interface Factory { function make(): object; } class UserFactory implements Factory { function make(): User; }
und kontravariantes Argument:
interface Concatable { function concat(Iterator $input); } class Collection implements Concatable { function concat(iterable $input) {/* . . . */} }
Benutzerdefinierte Objektserialisierung ( RFC )
Es stehen zwei neue magische Methoden zur Verfügung:
__serialize
und
__unserialize
. Dieser Serialisierungsmechanismus kombiniert die Vielseitigkeit der
Serializable
Schnittstelle mit dem Ansatz der Implementierung von
__sleep/__wakeup
Methoden. Weitere Details zu ihren Unterschieden finden Sie im RFC.
Verkettungspriorität ( RFC )
Wenn Sie so etwas geschrieben haben:
echo "sum: " . $a + $b;
PHP würde dies nun so interpretieren:
echo ("sum: " . $a) + $b;
PHP 8 wird dies anders interpretieren:
echo "sum :" . ($a + $b);
PHP 7.4 fügt eine Veralterungswarnung hinzu, wenn ein Ausdruck erkannt wird, der "." vor dem "+" oder "-" und nicht von Klammern umgeben.
__toString
( RFC ) __toString
Bisher konnten Ausnahmen von der magischen Methode
__toString
nicht ausgelöst werden. Der Grund für dieses Verhalten ist, dass die Konvertierung von Objekten in Zeichenfolgen in vielen Funktionen der Standardbibliothek durchgeführt wird und nicht alle bereit sind, Ausnahmen korrekt zu "verarbeiten". Im Rahmen dieses RFC wurde eine umfassende Prüfung der Zeichenfolgenkonvertierungen in der Codebasis durchgeführt, und diese Einschränkung kann nun aufgehoben werden.
Link Reflection ( RFC )
Bibliotheken wie
symfony/var-dumper
verlassen sich stark auf
ReflectionAPI
, um Variablen genau anzuzeigen. Bisher gab es keine angemessene Unterstützung für die Linkreflexion, was diese Bibliotheken dazu zwang, sich auf Hacks zu verlassen, um Links zu erkennen. PHP 7.4 fügt eine
ReflectionReference
Klasse hinzu, die dieses Problem löst.
RFC- Methode ( mb_str_split
) hinzugefügt
Diese Funktion bietet die gleiche Funktionalität wie
str_split
, jedoch für Zeichenfolgen, die in Multibyte-Codierungen geschrieben sind.
Immer verfügbare ext-hash
Erweiterung ( RFC )
Diese Erweiterung ist jetzt in allen PHP-Installationen ständig verfügbar.
PEAR ist standardmäßig nicht aktiviert ( EXTERNALS )
PEAR wird nicht mehr aktiv unterstützt. Das Kernteam hat beschlossen, es aus der Standardinstallation mit PHP 7.4 zu entfernen.
RFC (Password Hashing Algorithm Registry)
Eine neue
password_algos
Funktion wurde hinzugefügt, die eine Liste aller registrierten Passwort-Hashing-Algorithmen zurückgibt.
Schwache Links ( RFC )
Mit schwachen Links können Sie einen Link zu einem Objekt speichern, der die Zerstörung dieses Objekts nicht verhindert. Sie sind beispielsweise nützlich, um cacheähnliche Strukturen zu implementieren.
Zahlenliteraltrennzeichen ( RFC )
Das Fehlen visueller Trennzeichen in Zifferngruppen verlängerte die Zeit zum Lesen und Debuggen des Codes und konnte zu unbeabsichtigten Fehlern führen. Jetzt wurde die Unterstützung für den Unterstrich in numerischen Literalen hinzugefügt, um Gruppen von Zahlen visuell zu trennen.
1_000_000_000 // int 6.674_083e-11; // float 299_792_458; // decimal 0xCAFE_F00D; // hexadecimal 0b0101_1111; // binary 0137_041; // octal
Kurze offene Tags veraltet ( RFC )
Kurzes Eröffnungs-Tag
<?
ist veraltet und wird in PHP 8 entfernt. Das kurze Tag
<?= (echo)
nicht betroffen.
Linker assoziativer ternärer Operator abgelehnt veraltet ( RFC )
Der ternäre Operator hat einige seltsame Macken in PHP. Dieser RFC veraltet verschachtelte ternäre Operatoren.
1 ? 2 : 3 ? 4 : 5; // deprecated (1 ? 2 : 3) ? 4 : 5; // ok
In PHP 8 führt ein solcher Datensatz zu einem Fehler auf Kompilierungsebene.
Hier sind einige der wichtigsten rückwärts inkompatiblen Änderungen:
- Ein Aufruf von
parent::
in einer Klasse ohne übergeordnetes Element ist veraltet. - Durch Aufrufen von
var_dump
für eine Instanz von DateTime
oder DateTimeImmutable
keine DateTimeImmutable
mehr verfügbar. openssl_random_pseudo_bytes
in Fehlersituationen, die durch die OpenSSL-Bibliothek verursacht werden, eine Ausnahme aus. Zuvor wurde false zurückgegeben, was zur Generierung einer leeren Zeichenfolge führen konnte.- Beim Versuch, ein
PDO
oder eine Instanz eines PDOStatement
zu serialisieren, wird eine Exception
anstelle einer PDOException
. get_object_vars()
Sie get_object_vars()
für eine ArrayObject
Instanz ArrayObject
die Eigenschaften des ArrayObject
selbst zurückgegeben, nicht der Wert des ArrayObject
Arrays. Um ArrayObject
Array-Werte wie zuvor zu erhalten, ArrayObject
in den array
Typ um.