Einführung in PHP 7.4: Leistung, Funktionen, Abwertungen

Was bedeutet PHP 7.4 für Sie?


PHP entwickelt sich kontinuierlich weiter und hat gerade das neueste PHP 7.4-Update mit vielen neuen Funktionen veröffentlicht. Wie wir bereits in den letzten PHP 7-Releases bewiesen haben, werden Leistung und Geschwindigkeit weiter verbessert. Eine der aufregendsten neuen Funktionen ist das Vorladen . Es beschleunigt die Skriptausführung und ermöglicht aufgrund der vereinfachten gemeinsamen Codezeilen einen schnelleren und saubereren Code.

Die Verantwortlichen von PHP berücksichtigten die Kommentare und Wünsche ihrer Zuhörer maximal und beantworteten sie einwandfrei. Seitdem haben sie den Code kontinuierlich geändert, um das Umschalten zwischen den Programmiersprachen intuitiver und komfortabler zu gestalten.

PHP wird in über 78,9% aller Websites verwendet. Laut W3techs sind die beliebtesten Websites, die PHP verwenden, Wikipedia, Pinterest und Facebook, um nur einige zu nennen.

Wenn wir uns explizit WordPress-Sites ansehen, auf denen PHP ausgeführt wird, und PHP 5 und 7 vergleichen, können wir eine doppelte Geschwindigkeitssteigerung feststellen. Websites mit WordPress-Unterstützung profitieren am meisten von der Verwendung der neuesten PHP-Version.

Bild

Diese Grafik zeigt die Wahrheit über Websites, die aktiv PHP verwenden. Sind 40 Mio. Live-Websites genug, um Ihre Aufmerksamkeit zu erregen? So viele nutzen gerade PHP. Darüber hinaus bietet PHP 7.4 bereits bessere Testergebnisse als PHP 7.3 mit verbesserter Leistung und anderen Verbesserungen der Lebensqualität.

Die folgende Grafik zeigt den allgemeinen Benchmark-Test für neue und alte PHP-Versionen. Einige der getesteten Kriterien waren unter anderem Benutzerfreundlichkeit, Geschwindigkeit und Leistung.

Bild

Was ist neu in PHP 7.4?


Seit 2016 veröffentlicht PHP7 ununterbrochen jährliche Updates. Jedes Jahr bieten sie neue Funktionen, Ergänzungen und die Möglichkeit, saubereren Code zu schreiben, der die Sprache für diejenigen, die sie auf ihren Websites ausführen, zuverlässiger und benutzerfreundlicher macht.

Schauen wir uns einige der Änderungen an, die mit PHP 7.4 vorgenommen wurden. Eine vollständige Liste finden Sie hier .

Vorladen


Reden wir über Code. Wenn Sie ein Framework oder Bibliotheken verwenden, müssen die zugehörigen Dateien bei jeder Anforderung geladen und verknüpft werden. Beim Preloading können Sie Frameworks und Bibliotheken in den OPCache laden. Dadurch kann der Server die PHP-Dateien laden und während des Startvorgangs im Speicher ablegen und für zukünftige Anforderungen bereithalten. Sprechen Sie darüber, wie es schnell gehen kann!

Das Preloading wird von einer bestimmten php.ini- Direktive ausgeführt: opcache.preload . Dies hat den PHP-Skript-Compiler und wird ausgeführt, wenn der Server gestartet wird. Es kann auch verwendet werden, um weitere Dateien vorab zu laden und diese entweder einzuschließen oder zu kompilieren.

Das ist großartig. Wenn jedoch die Quelle der vorinstallierten Dateien geändert wird, muss der Server neu gestartet werden. Die vorinstallierten Dateien bleiben auch für immer im OPCache-Speicher zwischengespeichert.
Diese vorinstallierten Dateien sind jedoch weiterhin für zukünftige Anforderungen verfügbar, falls Sie sie jemals wieder verwenden müssen.

Spread-Operator in Array-Ausdrücken


Als PHP 5.6 veröffentlicht wurde, hat PHP begonnen, das Entpacken von Argumenten (Spread-Operator) zu unterstützen. In Version 7.4 können wir diese Funktion jedoch mit einem Array-Ausdruck verwenden. Das Entpacken von Argumenten ist eine Syntax zum Entpacken von Arrays und Traversables in Argumentlisten. Und dazu muss nur ... (3 Punkte) vorangestellt werden. Das war's.

Schauen wir uns dieses Beispiel an:

$animals = ['dog', 'cat']; $animalkingdom = ['lion', 'elephant', ...$animals, 'giraffe']; // ['lion', 'elephant', 'dog', 'cat', 'giraffe']; 

Wir können jetzt ein Array von einer beliebigen Stelle in einem anderen Array aus erweitern, indem wir einfach die Spread Operator-Syntax verwenden.

Hier ist ein längeres Beispiel:

 $num1 = [1, 2, 3]; $num2 = [...$num1]; // [1, 2, 3] $num3 = [0, ...$num1]; // [0, 1, 2, 3] $num4 = array(...$num1, ...$num2, 111); // [1, 2, 3, 1, 2, 3, 111] $num5 = [...$num1, ...$num1]; // [1, 2, 3, 1, 2, 3] 

Nicht nur das, sondern Sie können es auch in einer Funktion verwenden. Schauen Sie sich dieses Beispiel an:

 function getNum() { return ['a', 'b']; } $num6 = [...getNum(), 'c']; // ['a', 'b', 'c'] $num7 = [...new NumIterator(['a', 'b', 'c'])]; // ['a', 'b', 'c'] function arrGen() { for($i = 11; $i < 15; $i++) { yield $i; } } $num8 = [...arrGen()]; // [11, 12, 13, 14] 

Außerdem können Sie jetzt Arrays und Generatoren, die von einer Funktion zurückgegeben werden, direkt in ein neues Array entpacken.

Ein Codebeispiel würde so aussehen:

 function getAnimals(){ return ['dog', 'cat', 'elephant']; } $num1 = [...getAnimals(), 'lion', 'tiger', 'giraffe']; 

Und mit PHP 7.4 würde es drucken:

 array(6) { [0]=> string(3) "dog" [1]=> string(3) "cat" [2]=> string(8) "elephant" [3]=> string(4) "lion" [4]=> string(5) "tiger" [5]=> string(7) "giraffe" } 

Mit diesem neuen Array-Ausdruck sollten Spread-Operatoren eine deutlich bessere Leistung als 7.3 array_merge haben. Dies liegt daran, dass der Spread-Operator eine Sprachstruktur ist, während array_merge eine Funktion ist. Auch weil der Operator spread Objekte unterstützt, die traversable implementieren, und array_merge nur Arrays unterstützt.

Zu beachten ist, dass Sie nur indizierte Arrays verwenden können, da Zeichenfolgenschlüssel nicht unterstützt werden. Bei Verwendung wird ein behebbarer Fehler auf dem Bildschirm angezeigt, sobald ein Zeichenfolgenschlüssel gefunden wurde.
Ein weiterer großer Vorteil von 7.4 ist das Entfernen von array_merge. Verabschieden Sie sich von der gefürchteten Indexverschiebung!

Schauen wir uns zum Beispiel diese lange verschlungene Array-Zusammenführung an:

 $array = ['banana, 'orange']; $array[2] = 'orange'; $array[1] = 'apple'; //shifting var_dump($array); // prints array(3) { [0]=> string(6) "banana" [1]=> string(5) "apple" [2]=> string(6) "orange" 

Ein weiterer Vorteil von 7.4 ist die Verwendung der Generatorfunktion. Eine Generatorfunktion funktioniert genau wie eine normale Funktion, außer dass eine Generatorfunktion nicht einen Wert zurückgibt, sondern so viele Werte liefert, wie sie benötigt.

Schauen Sie sich den folgenden Beispielcode an:

 function generator() { for ($i = 3; $i <= 5; $i++) { yield $i; } } $num1 = [0, 1, 2, ...generator()]; 

Schwache Referenzen


PHP 7.4 hat jetzt eine WeakReference-Klasse, die nicht mit der Klasse WeakRed oder der Weakref- Erweiterung zu verwechseln ist.

Mit WeakReferences kann der Programmierer eine Referenz auf ein Objekt aufrufen . Dies ist nützlich, da es nicht verhindert, dass das Objekt zerstört wird. Sie sind hilfreich für die Implementierung von Cache-ähnlichen Strukturen.

 WeakReference { /* Methods */ public __construct ( void ) public static create ( object $referent ) : WeakReference public get ( void ) : ?object } 

Kontravariante Parameter und kovariante Rückgaben


Derzeit verwendet PHP hauptsächlich invariante Parametertypen und Rückgabetypen. Das heißt, wenn eine Methode einen Parameter oder einen Rückgabetyp von X hat, muss der Subtyp-Parameter oder der Rückgabetyp ebenfalls vom Typ X sein.

Mit PHP 7.4 wird nun vorgeschlagen, kovariante (von spezifisch nach generisch geordnete) und kontravariante (in umgekehrter Reihenfolge) Parameter- und Rückgabetypen zuzulassen.

Hier ist ein Beispiel für beides:

Beispiel für einen Covariant-Rückgabetyp:

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

Beispiel für einen kontravarianten Parametertyp:

 interface Concatable { function concat(Iterator $input); } class Collection implements Concatable { // accepts all iterables, not just Iterator function concat(iterable $input) {/* . . . */} } 

Typisierte Eigenschaften 2.0


Seit PHP 5 sind Typhinweise ein verfügbares Feature, mit dem Sie den Variablentyp angeben können, der voraussichtlich an eine Funktion oder Klasse übergeben wird. Bei den PHP 7.2-Migrationen gab die Hinzufügung des Objektdatentyps die Hoffnung, dass in Zukunft mehr zur Verfügung stehen würden. Die Zukunft ist jetzt.

In der neuen Version 7.4 kann PHP die folgende Typenliste unterstützen:

 bool, int, float, string, array, object, iterable, self, parent any class or interface name ?type // where "type" may be any of the above 

Beachten Sie, dass der übergeordnete Typ in Klassen verwendet werden kann und keinen übergeordneten Typ haben muss, der mit dem Parameter und dem Rückgabetyp übereinstimmt.

Beachten Sie auch, dass void und callable nicht unterstützt werden. Die Lücke wurde entfernt, weil sie nicht nützlich war und eine unklare Semantik aufwies. Callable , weil sein Verhalten kontextabhängig war.

Schauen wir uns einige weitere Beispiele an.

Hier ist eine Klasse, die für PHP 7.3 geschrieben wurde:

 class User { /** @var int $id */ private $id; /** @var string $name */ private $name; public function __construct(int $id, string $name) { $this->id = $id; $this->name = $name; } public function getId(): int { return $this->id; } public function setId(int $id): void { $this->id = $id; } public function getName(): string { return $this->name; } public function setName(string $name): void { $this->name = $name; } } 

In PHP 7.4 kann eine Klasse jetzt so einfach geschrieben werden, ohne auf die Typensicherheit zu verzichten:

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

Hier einige Beispiele für alle Typen, die 7.4 jetzt unterstützt:

 class Example { public int $scalarType; protected ClassName $classType; private ?ClassName $nullableClassType; // Types are also legal on static properties public static iterable $staticProp; // Types can also be used with the "var" notation var bool $flag; // Typed properties may have default values (more below) public string $str = "foo"; public ?string $nullableStr = null; // The type applies to all properties in one declaration public float $x, $y; // equivalent to: public float $x; public float $y; } 

Pfeilfunktionen 2.0


Anonyme Funktionen in PHP sind in der Regel wortreich und langwierig, selbst wenn sie nur einfache Operationen ausführen. Dies ist teilweise auf eine große Menge an syntaktischem Boilerplate und teilweise auf die Notwendigkeit zurückzuführen, verwendete Variablen manuell zu importieren.

Dies macht Code, der einfache Verschlüsse verwendet, verwirrend zu lesen und noch schwieriger zu verstehen.

Schauen wir uns einen Code an, den Sie mit PHP 7.3 verwenden würden:

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

Hier ist die präzisere Syntax von PHP 7.4:

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

Daher haben Pfeilfunktionen jetzt diese einfache Form:

 fn(parameter_list) => expr 

Unten sehen Sie ein Beispiel für zwei Funktionen $ fn1 (7.3) und $ fn2 (7.4) nebeneinander. Sie haben das gleiche Ergebnis, sehen aber anders aus:

 $y = 1; $fn1 = fn($x) => $x + $y; $fn2 = function ($x) use ($y) { return $x + $y; }; 

Dies funktioniert auch, wenn die Pfeilfunktionen verschachtelt sind:

 $z = 1; $fn = fn($x) => fn($y) => $x * $y + $z; 

Hier erfasst die äußere Funktion $ z . Dann erfasst die innere Funktion auch $ z von der äußeren Funktion. Mit 7.4 kann der äußere Bereich in der inneren Funktion verfügbar werden. Das konnte 7.3 nicht.

Die Pfeilfunktionssyntax ermöglicht eine Vielzahl von Funktionen wie Variadics, Standardwerte, Parameter- und Rückgabetypen sowie das Übergeben und Zurückgeben von Verweisen. Alles unter Beibehaltung eines sauberen, lesbaren Aussehens. Nachfolgend finden Sie alle gültigen Pfeilfunktionen, die jetzt verfügbar sind:

 fn(array $x) => $x; fn(): int => $x; fn($x = 42) => $x; fn(&$x) => $x; fn&($x) => $x; fn($x, ...$rest) => $rest; 

Zu beachten ist, dass Pfeilfunktionen die niedrigste Priorität haben. Siehe das Beispiel:

 fn($x) => $x + $y // is fn($x) => ($x + $y) // not (fn($x) => $x) + $y 

Abschreibungen


Mit der Zusammenführung zu 7.4 sind viele Abstriche verbunden. Die folgende Liste gibt einen kurzen Überblick über die Funktionen, die für die Abschaffung vorgesehen sind. Eine ausführlichere Erklärung finden Sie hier :

  • Der wahre Typ
  • Magic zitiert Vermächtnis
  • array_key_exists () mit Objekten
  • FILTER_SANITIZE_MAGIC_QUOTES Filter
  • Reflection export () Methoden
  • mb_strrpos () mit Kodierung als 3. Argument
  • implode () Parameter Reihenfolge Mix
  • Dies von nicht statischen Verschlüssen lösen
  • hebrevc () Funktion
  • Funktion convert_cyr_string ()
  • Funktion money_format ()
  • Funktion ezmlm_hash ()
  • r estore_include_path () - Funktion
  • allow_url_include ini directiv

Einige wichtige Punkte sind die folgenden zweistufigen Abwertungen.

Ändern der Priorität eines Verkettungsoperators


Gegenwärtig sind die Operatoren '.', '+' Und '-' alle gleich. Jede Kombination dieser Operatoren wird einfach von links nach rechts gelöst.

Sehen wir uns diesen Code in PHP 7.3 an:

 echo "sum: " . $a + $b; // would be evaluated left-to-right echo ("sum: " . $a) + $b; // could also look like this 

In PHP 7.4 haben '+' und '-' Vorrang vor '.' Die Additionen und Subtraktionen werden also immer vor der Zeichenfolge ausgeführt. Dies würde folgendermaßen aussehen:

 echo "sum: " . $a + $b; // would be executed as if the code were as follows. echo "sum :" . ($a + $b); 

Dieser zweistufige Vorschlag zielt darauf ab, weniger fehleranfällig und instinktiver zu sein. PHP 7.4 befindet sich derzeit in der ersten Phase mit einer Verfallserklärung für nicht in Klammern gesetzte Ausdrücke von '+', '-' und '.' Während Sie auf die endgültige Abstimmung / Änderung in PHP 8 warten.

Linksassoziativer ternärer Operator


Im Gegensatz zu den meisten anderen Sprachen ist der ternäre Operator in PHP eher linksassoziativ als rechtsassoziativ. Dies ist nicht nur ungewöhnlich, sondern auch verwirrend für Programmierer, die zwischen verschiedenen Sprachen wechseln. PHP 7.4 schlägt vor, die Linksassoziativität zu entfernen und erfordert stattdessen die Verwendung von Klammern.

Werfen wir einen Blick auf den folgenden Code:

 return $a == 1 ? 'one' : $a == 2 ? 'two' : $a == 3 ? 'three' : $a == 4 ? 'four' : 'other'; 

In den meisten anderen Sprachen würde es interpretiert werden als:

 return $a == 1 ? 'one' : ($a == 2 ? 'two' : ($a == 3 ? 'three' : ($a == 4 ? 'four' : 'other'))) 

In PHP wird es stattdessen wie folgt interpretiert:

 return ((($a == 1 ? 'one' : $a == 2) ? 'two' : $a == 3) ? 'three' : $a == 4) ? 'four' : 'other'; 

Dies kann zu Fehlern führen, da dies in der Regel nicht beabsichtigt ist.

Durch einen separaten zweistufigen Vorschlag hat PHP 7.4 die explizite Verwendung von Klammern als Verfallswarnung implementiert und wird hoffentlich in zukünftigen Versionen einen Laufzeitfehler beim Kompilieren verursachen.

Fazit


Pünktlich zu den Feiertagen bringt PHP 7.4 neue Funktionen und Verbesserungen der Lebensqualität für alle PHP-Entwickler.

WordPress-Websites werden definitiv von diesen Verbesserungen profitieren und ihre Benutzer können mit kürzeren Ausführungszeiten und geringerem Speicherverbrauch rechnen, wenn sie PHP 7.4 im Vergleich zu früheren Versionen verwenden.

Mit erstklassigen Deklarationen und Hinweisen zu Eigenschaftstypen, Funktionen zum Zusammenführen von Pfeilen und einer auf lächerliche Weise höheren Geschwindigkeit verbessert der 7.4 mit Sicherheit sowohl die Geschwindigkeit als auch die Qualität Ihres Workflows.

Source: https://habr.com/ru/post/de483128/


All Articles