Login / Registrieren

PHP 7.4 - Features

Einleitung

Elephants

Bild: Sucram Yef, CC-BY 2.0

Der zweite RC von PHP Version 7.4 wurde letzten Donnerstag nach Plan veröffentlicht und bis zum Full Release, geplant für den 28. November 2019, ist es nicht mehr so weit, daher wird es Zeit mal einen Blick auf die in meinen Augen wichtigsten Erneuerungen zu werfen.

Typisierte Eigenschaften 2.0

Seit PHP 7 ist es möglich die Parameter und den Rückgabewert von Funktionen zu typisieren. Ab der neuen Version kommt die Typisierung von Attributen hinzu.

Valide sind alle bisherigen Typen bis auf void und callable.
Statische Attribute sowie Referenzen werden ebenfalls unterstützt.

class User {
    public int $id;
    public string $name;
 
    public function __construct(int $id, string $name) {
        $this->id = $id;
        $this->name = $name;
    }
}

 

Pfeilfunktionen 2.0

Anonyme Funktionen gibts es schon länger in PHP, jedoch sind diese verglichen mit anderen Skript- und Programmiersprachen eher umständlich zu nutzen, insbesondere dann, wenn man Variablen übergeordneter Bereiche verwenden möchte.

Ab PHP 7.4 wird die Syntax deutlich vereinfacht und die Variablen der übergeordneten Bereiche sind by-value verfügbar.

function array_values_from_keys($arr, $keys) {
    return array_map(fn($x) => $arr[$x], $keys);
}

 

Array Spread Operator

Argument Unpacking ist schon seit PHP 5.6 verfügbar, doch nun können auch Arrays und Traversables entpackt werden.

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

 

Der Spread Operator ist array_merge aufgrund der besseren Performance vorzuziehen.
Rückgabewerte von Funktionen lassen sich ebenfalls so entpacken.
 

Null Coalesce Equal Operator

Mit dem ?? Operator lässt sich überprüfen, ob ein linksstehender Wert null entspricht. Ist dies der Fall, wird der rechtsstehende zugewiesen.

$action = $_POST['action'] ?? 'standard';

 

Der neue ??= Operator verschmilzt den obrigen mit einer Zuweisung.

// Die folgenden Zeilen sind gleichwertig
$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';
$this->request->data['comments']['user_id'] ??= 'value';

 

Kovariante Rückgabewerte und Kontravariante Parameter

Durch die Einführung von kovarianten Rückgabewerten und kontravariante Parametern wird die Striktheit beim Überschreiben der Methodentypen aufgehoben.
Vorraussetzung beim Überschreiben ist natürlich, dass die Typsicherheit gewährleistet wird. 
Dies wird die Arbeit mit Interfaces und abstrakten Methoden besonders erleichtern.

interface Factory {
    function make(): object;
}
 
class UserFactory implements Factory {
    function make(): User;
}

 

Trennzeichen bei Zahlen

Ein kleines Feature zur Verbesserung der Codelesbarkeit: 
Um auch bei großen Zahlen den Überblick zu behalten werden Trennzeichen für alle numerischen Typen hinzugefügt.

$sum = 3_589_123_158;
$testValue = ‪107_925_284.88; 
$discount = 135_00;

 

Preload

Um die Geschwindigkeit seiner Applikation zu erhöhen, gibt es nun die Möglichkeit ausgewählte PHP-Dateien vor dem eigentlichen Starten der Applikation in den Arbeitsspeicher beständig zu laden. Realisiert wird dies über den Eintrag opcache.preload in der php.ini. Dort kann künftig der Pfad zu einer Datei eingetragen werden, in welcher wiederrum weitere Dateien inkludiert werden können. 
Damit Änderungen an den vorgeladeten Dateien wirksam werden muss jedoch der Server neugestartet werden. 
Dies eignet sich besonders für alle oftmals genutzten Frameworks und Libraries.

Weitere Informationen dazu findet ihr hier.

Höhere Geschwindigkeit

Dem Benchmark von Andrei Avram zufolge erhöht sich die Geschwindigkeit der neuen Version merklich:

5.6
Execution time: 5.312573 seconds
Memory usage: 1332.009947 MB
7.0
Execution time: 1.800094 seconds
Memory usage: 347.669807 MB
7.1
Execution time: 1.627879 seconds
Memory usage: 347.669807 MB
7.2
Execution time: 0.751810 seconds
Memory usage: 347.669807 MB
7.3
Execution time: 0.744523 seconds
Memory usage: 347.669807 MB
7.4-rc
Execution time: 0.631683 seconds
Memory usage: 347.669807 MB
 

Kleine Vorschau für PHP 8 vorweg: 
Dank des künftig erscheinenden Just-In-Time Compilers soll die Geschwindigkeit gegenüber PHP 7.4 nochmals vervierfacht werden.
Geplant ist dieses Feature schon experimentell in PHP 7.4 zu integrieren.

 

Die vollständige Liste mit allen Features findet ihr hier.

Author: Thomas Wilczek

Wenn ihr Fragen habt, meldet euch: info@mobilistics.de

oder schreibt uns im Support-Center

Im Blog oder auf unserer Homepage könnt ihr gerne schauen, was wir sonst noch so machen.