PHP 7.4 ist die nächste Nebenversion von PHP 7 und wird voraussichtlich am 28. November 2019 zur allgemeinen Verfügbarkeit freigegeben. Werfen wir einen Blick auf die neuen Funktionen in PHP 7.4, die PHP schneller und zuverlässiger machen.
Natürlich freue ich mich mehr auf PHP 8. Da einige Vorschläge von JIT genehmigt wurden, könnte dies ein weiterer Meilenstein für PHP werden.
Was ist neu in PHP mit PHP 7.4?
● Unterstützung des Entpackens innerhalb von Arrays – Array-Spread-Operator
● Pfeilfunktion 2.0 (kürzerer Abschluss)
PHP 7.4 in Arrays Der Spread-Operator
wird in Ausdrücken eingeführt und ist seit PHP 5.6 verfügbar. Parameter unpacking ist eine Syntax zum Entpacken von Arrays und Traverable in Parameterlisten. Um ein Array oder Traversable zu entpacken, muss ihm ... (3 Punkte) vorangestellt werden, wie im folgenden Beispiel:
function test(...$args) { var_dump($args); } test(1, 2, 3);
PHP 7.4 RFC empfiehlt jedoch, diese Funktionalität auf Arrays zu erweitern Definition:
$arr = [...$args];
Der erste Vorteil des Spread-Operators ist die Leistung, und in der RPC-Dokumentation heißt es, dass der :
Spread-Operator eine bessere Leistung als array_merge haben sollte. Es ist nicht nur so, dass der Spread-Operator ein Syntaxkonstrukt und array_merge eine Methode ist. Auch zur Kompilierzeit werden konstante Arrays für eine hohe Effizienz optimiert. Ein wesentlicher Vorteil des Spread-Operators besteht darin, dass er jedes durchquerbare Objekt unterstützt, während die Funktion array_merge nur Arrays unterstützt.
Hier ist ein Beispiel für Parameter in einem Array mit dem Spread-Operator:
$parts = ['apple', 'pear']; $fruits = ['banana', 'orange', ...$parts, 'watermelon']; var_dump($fruits);
Wenn Sie diesen Code in PHP 7.3 oder früher ausführen, gibt PHP einen Parse-Fehler aus:
Parse error: syntax error, unexpected '...' (T_ELLIPSIS), expecting ']' in /app/spread-operator.php on line 3
Stattdessen gibt PHP 7.4 ein Array zurück
array(5) { [0]=> string(6) "banana" [1]=> string(6) "orange" [2]=> string(5) "apple" [3]=> string(4) "pear" [4]=> string(10) "watermelon" }
Der RFC gibt an, dass wir dasselbe Array mehrmals erweitern können. Darüber hinaus können wir die Syntax des Spread-Operators an einer beliebigen Stelle im Array verwenden, da reguläre Elemente vor oder nach dem Spread-Operator hinzugefügt werden können. Daher funktioniert der folgende Code wie erwartet:
$arr1 = [1, 2, 3]; $arr2 = [4, 5, 6]; $arr3 = [...$arr1, ...$arr2]; $arr4 = [...$arr1, ...$arr3, 7, 8, 9];
Es ist auch möglich, das von der Funktion zurückgegebene Array als Parameter zu übergeben und in ein neues Array einzufügen:
function buildArray(){ return ['red', 'green', 'blue']; } $arr1 = [...buildArray(), 'pink', 'violet', 'yellow'];
PHP 7.4-Ausgaben das folgende Array:
array(6) { [0]=> string(3) "red" [1]=> string(5) "green" [2]=> string(4) "blue" [3]=> string(4) "pink" [4]=> string(6) "violet" [5]=> string(6) "yellow" }
Wir können auch den
Generator verwenden: function generator() {
for ($i = 3; $i <= 5; $i++) {
yield $i;
}
}
$arr1 = [0, 1, 2, ...generator()];
, aber die Übergabe als Referenz ist nicht zulässig. Betrachten Sie das folgende Beispiel:
$arr1 = ['red', 'green', 'blue']; $arr2 = [...&$arr1];
Wenn wir versuchen, per Referenz zu übergeben, gibt PHP den folgenden Parse-Fehler aus:
Parse error: syntax error, unexpected '&' in /app/spread-operator.php on line 3
Wenn die Elemente des ersten Arrays per Referenz gespeichert werden, dann sind sie es wird auch per Referenz im zweiten Array gespeichert. Hier ist ein Beispiel:
$arr0 = 'red'; $arr1 = [&$arr0, 'green', 'blue']; $arr2 = ['white', ...$arr1, 'black'];
Das bekommen wir mit PHP 7.4:
array(5) { [0]=> string(5) "white" [1]=> &string(3) "red" [2]=> string(5) "green" [3]=> string(4) "blue" [4]=> string(5) "black" }Arrow Functions 2.0 (Short Closures)
In PHP , Anonyme Funktionen gelten als sehr ausführlich und schwierig zu implementieren und zu warten.
RFCempfiehlt die Einführung einer einfacheren und klareren Pfeilfunktionssyntax (oder eines kurzen Verschlusses), damit wir Code prägnant schreiben können. Vor PHP 7.4:
function cube($n){ return ($n * $n * $n); } $a = [1, 2, 3, 4, 5]; $b = array_map('cube', $a); print_r($b);
PHP 7.4 ermöglicht eine prägnantere Syntax, die obige Funktion kann wie folgt umgeschrieben werden:
$a = [1, 2, 3, 4, 5]; $b = array_map(fn($n) => $n * $n * $n, $a); print_r($b);
Derzeit ist aufgrund der Sprachstruktur
Anonyme Funktionen (Abschlüsse) können mithilfe von use Variablen erben, die im übergeordneten Bereich definiert sind, wie unten gezeigt: $factor = 10;
$calc = function($num) use($factor){
return $num * $factor;
};
Aber in PHP 7.4 wird der Wert des übergeordneten Bereichs implizit erfasst (implizit gebunden). um den Umfang des Wertes). Wir können diese Funktion also in einer Zeile vervollständigen:
$factor = 10; $calc = fn($num) => $num * $factor;
Variablen, die im übergeordneten Bereich definiert sind, können für Pfeilfunktionen verwendet werden. Dies entspricht unserer Verwendung und kann vom übergeordneten Element nicht geändert werden.
Die neue Syntax stellt eine große Verbesserung der Sprache dar, da sie es uns ermöglicht, besser lesbaren und wartbareren Code zu erstellen.
NULL-KoaleszieroperatorAufgrund der großen Anzahl von Situationen, in denen ternäre Ausdrücke und isset() im täglichen Gebrauch gleichzeitig verwendet werden, haben wir den Nullkoaleszieroperator (? ?) Dieser syntaktische Zucker. Wenn die Variable existiert und nicht NULL ist, gibt sie ihren eigenen Wert zurück, andernfalls gibt sie ihren zweiten Operanden zurück.
$username = $_GET['user'] ?? ‘nobody';
Die Funktionsweise dieses Codes ist sehr einfach: Er ruft den Anforderungsparameter ab und legt einen Standardwert fest, wenn dieser nicht vorhanden ist. Aber was ist, wenn wir in diesem RFC-Beispiel längere Variablennamen haben?
$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';
长远来看,这段代码可能难以维护。因此,旨在帮助开发人员编写更直观的代码,这个 RFC 建议引入 null 合并等于运算符 (null_coalesce_equal_operator)??=,所以我们可以敲下面这段代码来替代上面的这段代码:
$this->request->data['comments']['user_id'] ??= ‘value’;
如果左侧参数的值为 null,则使用右侧参数的值。
注意,虽然 coalesce 运算符 ?? 是一个比较运算符,但 ??= 它是赋值运算符。