Einführung in PHP 7: Was ist neu und was ist weg
Veröffentlicht: 2022-03-11Eines der aufregendsten Ereignisse im Jahr 2015 in der PHP-Welt war die Veröffentlichung von PHP 7, 10 Jahre nach der Veröffentlichung der letzten Hauptversion, PHP 5. Mit einem großen Schritt nach vorne führt PHP 7 zahlreiche neue Funktionen und Leistungsverbesserungen ein .
Es werden jedoch auch alte, veraltete Funktionen entfernt, was zu einigen Kompatibilitätsbrüchen führt, wodurch es für ältere Anwendungen schwieriger wird, auf die neue Version zu migrieren. Dieser Leitfaden soll als kurze Tour dazu dienen, was Sie erwartet, wenn Sie vorhaben, Ihre bestehenden Anwendungen auf PHP 7 zu verschieben oder neue zu erstellen.
Aber warte, wo ist PHP 6 geblieben?
Wenn Sie in letzter Zeit nicht mit PHP gearbeitet haben, fragen Sie sich vielleicht, was mit PHP 6 passiert ist, warum der Sprung von PHP 5 zu PHP 7? Nun, lange Rede kurzer Sinn, PHP 6 war ein Fehlschlag. Das Hauptmerkmal von Version 6 war die native Unterstützung von Unicode-Zeichen, da PHP hauptsächlich in der Webentwicklung verwendet wird und das Web Unicode benötigt, sodass der Schritt, Unicode in PHP zu bringen, sinnvoll war.
Die Idee war, vollständige Unterstützung für Unicode in den Kern selbst zu bringen. Es hätte der Sprache erweiterte Möglichkeiten gebracht, von der Möglichkeit, dumme Emojis als Variablen- und Funktionsnamen zu verwenden, bis hin zu leistungsstarken internationalen Zeichenfolgenfunktionen. Zum Beispiel, wenn eine andere Sprache Groß- und Kleinbuchstaben anders verwendet als Englisch oder wenn ein Name in chinesischen Schriftzeichen ins Englische umgewandelt werden muss.
Leider erwies sich dieser ehrgeizige Plan als größeres Problem als erwartet. Ein Großteil der Codebasis musste portiert werden, um Unicode sowohl für den Kern als auch für wichtige Erweiterungen zu unterstützen, was sich als mühsam und knifflig herausstellte. Dies verlangsamte die Entwicklung anderer Funktionen in der Sprache und frustrierte dabei viele PHP-Entwickler. Zusätzliche Hürden tauchten auf, was zu einem geringeren Interesse an der Entwicklung einer nativen Unicode-Unterstützung führte, was schließlich zum Abbruch des Projekts führte.
Da Ressourcen wie Bücher und Artikel für PHP 6 und seine Unicode-Unterstützung geschrieben wurden, würde die neue Version in PHP 7 umbenannt, um Verwirrung zu vermeiden.
Wie auch immer, genug Verweilen in der traurigen Vergangenheit, lasst uns sehen, was PHP 7 auf die Party bringt.
Leistungskampf, PHP 7 vs. PHP 5
Bei praktisch allen Updates ist mit geringfügigen Leistungssteigerungen zu rechnen. Dieses Mal bringt PHP jedoch eine deutliche Verbesserung gegenüber früheren Versionen, was die reine Leistung zu einer der attraktivsten Eigenschaften von PHP 7 macht. Dies ist Teil des „PHPNG“-Projekts, das sich mit den Interna der Zend Engine selbst befasst.
Durch Refactoring interner Datenstrukturen und Hinzufügen eines Zwischenschritts zur Codekompilierung in Form eines Abstract Syntax Tree (AST) ist das Ergebnis eine überlegene Leistung und eine effizientere Speicherzuweisung. Die Zahlen selbst sehen sehr vielversprechend aus; Benchmarks, die mit realen Apps durchgeführt wurden, zeigen, dass PHP 7 im Durchschnitt doppelt so schnell ist wie PHP 5.6 und zu 50 Prozent weniger Speicherverbrauch bei Anfragen führt, was PHP 7 zu einem starken Konkurrenten für den HHVM JIT-Compiler von Facebook macht. Sehen Sie sich diese Infografik von Zend an, die die Leistung einiger gängiger CMS und Frameworks darstellt.
Die Verringerung des Speicherverbrauchs ermöglicht es kleineren Maschinen auch, Anforderungen besser zu verarbeiten, und bietet die Möglichkeit, Mikrodienste rund um PHP zu erstellen. Die internen Änderungen, insbesondere die AST-Implementierung, eröffnen auch Möglichkeiten für zukünftige Optimierungen, die die Leistung noch weiter steigern könnten. Für zukünftige Versionen wird über eine neue, hauseigene Implementierung eines JIT-Compilers nachgedacht.
PHP 7 syntaktischer Zucker
PHP 7 kommt mit neuen Syntax-Features. Obwohl sie die Möglichkeiten der Sprache selbst nicht erweitern, bieten sie eine bessere oder einfachere Möglichkeit, Ihren Code angenehmer zu schreiben und angenehmer für das Auge zu machen.
Gruppeneinfuhranmeldungen
Jetzt können wir Import-Deklarationen für Klassen, die aus demselben Namensraum stammen, in einer einzigen use
gruppieren. Dies sollte helfen, Deklarationen sinnvoll auszurichten oder einfach einige Bytes in Ihren Dateien zu sparen.
use Framework\Module\Foo; use Framework\Module\Bar; use Framework\Module\Baz;
Mit PHP 7 können wir verwenden:
use Framework\Module\{Foo, Bar, Baz};
Oder, wenn Sie einen mehrzeiligen Stil bevorzugen:
use Framework\Module{ Foo, Bar, Baz };
Null-Koaleszenz-Operator
Dies löst ein häufiges Problem in der PHP-Programmierung, bei dem wir einer Variablen einen Wert aus einer anderen Variablen zuweisen möchten, wenn letztere tatsächlich gesetzt ist, oder ihr anderweitig einen anderen Wert geben möchten. Es wird häufig verwendet, wenn wir mit Benutzereingaben arbeiten.
Vor PHP 7:
if (isset($foo)) { $bar = $foo; } else { $bar = 'default'; // we would give $bar the value 'default' if $foo is NULL }
Nach PHP7:
$bar = $foo ?? 'default';
Dies kann auch mit einer Reihe von Variablen verkettet werden:
$bar = $foo ?? $baz ?? 'default';
Raumschiffbetreiber
Der Raumschiff-Operator <=>
ermöglicht einen Drei-Wege-Vergleich zwischen zwei Werten, der nicht nur anzeigt, ob sie gleich sind, sondern auch, welcher größer ist, bei Ungleichheit, indem er 1,0 oder -1 zurückgibt.
Hier können wir verschiedene Maßnahmen ergreifen, je nachdem, wie sich die Werte unterscheiden:
switch ($bar <=> $foo) { case 0: echo '$bar and $foo are equal'; case -1: echo '$foo is bigger'; case 1: echo '$bar is bigger'; }
Die verglichenen Werte können Ganzzahlen, Floats, Strings oder sogar Arrays sein. Überprüfen Sie die Dokumentation, um eine Vorstellung davon zu bekommen, wie verschiedene Werte miteinander verglichen werden. [https://wiki.php.net/rfc/combined-comparison-operator]
Neue Funktionen in PHP 7
Aber natürlich bringt PHP 7 auch neue und spannende Funktionalitäten mit sich.
Skalarparametertypen und Hinweise zu Rückgabetypen
PHP 7 erweitert die bisherigen Typdeklarationen von Parametern in Methoden (Klassen, Interfaces und Arrays) um die vier skalaren Typen; Ganzzahlen ( int
), Floats ( float
), Booleans ( bool
) und Strings ( string
) als mögliche Parametertypen.
Außerdem können wir optional angeben, welchen Typ Methoden und Funktionen zurückgeben. Unterstützte Typen sind bool , int , float , string , array , callable , name of Class or Interface , self und parent (für Klassenmethoden)
class Calculator { // We declare that the parameters provided are of type integer public function addTwoInts(int $x, int $y): int { return $x + $y; // We also explicitly say that this method will return an integer } }
Typdeklarationen ermöglichen das Erstellen robusterer Anwendungen und vermeiden das Übergeben und Zurückgeben falscher Werte von Funktionen. Weitere Vorteile sind statische Code-Analysatoren und IDEs, die bei fehlenden DocBlocks einen besseren Einblick in die Codebasis bieten.
Da PHP eine schwach typisierte Sprache ist, werden bestimmte Werte für Parameter und Rückgabetypen je nach Kontext umgewandelt. Wenn wir den Wert „3“ in einer Funktion übergeben, die einen deklarierten Parameter vom Typ int
hat, akzeptiert der Interpreter ihn als Ganzzahl und gibt keine Fehler aus. Wenn Sie dies nicht möchten, können Sie den strict mode
aktivieren, indem Sie eine declare
hinzufügen.
declare(strict_types=1);
Dies wird pro Datei festgelegt, da eine globale Option Code-Repositories in solche aufteilen würde, die mit globaler Strenge erstellt wurden, und solche, die dies nicht tun, was zu unerwartetem Verhalten führt, wenn wir Code aus beiden kombinieren.
Engine-Ausnahmen
Durch das Hinzufügen von Engine-Ausnahmen können schwerwiegende Fehler, die zum Beenden des Skripts geführt hätten, leicht abgefangen und behandelt werden.
Fehler wie das Aufrufen einer nicht vorhandenen Methode beenden das Skript nicht, sondern lösen eine Ausnahme aus, die von einem Try-Catch-Block behandelt werden kann, wodurch die Fehlerbehandlung für Ihre Anwendungen verbessert wird. Dies ist für bestimmte Arten von Apps, Servern und Daemons wichtig, da schwerwiegende Fehler sonst einen Neustart erfordern würden. Tests in PHPUnit sollten auch benutzerfreundlicher werden, da schwerwiegende Fehler die gesamte Testsuite fallen lassen. Ausnahmen statt Fehler würden pro Testfall behandelt.
PHP 7 fügt eine Reihe neuer Ausnahmeklassen hinzu, die auf der Art der möglicherweise auftretenden Fehler basieren. Um die Kompatibilität zwischen den Versionen aufrechtzuerhalten, wurde eine neue Throwable
Schnittstelle hinzugefügt, die sowohl von Engine-Ausnahmen als auch von Benutzerausnahmen implementiert werden kann. Dies war notwendig, um Engine-Ausnahmen zur Erweiterung der Basis-Ausnahmeklasse zu vermeiden, was zu älteren Code-Catching-Ausnahmen führte, die vorher nicht vorhanden waren.
Vor PHP 7 hätte dies das Skript mit einem fatalen Fehler beendet:
try { thisFunctionDoesNotEvenExist(); } catch (\EngineException $e) { // Clean things up and log error echo $e->getMessage(); }
Anonyme Klassen
Anonyme Klassen sind Cousins von anonymen Funktionen, die Sie in einer einfachen kurzfristigen Instanz verwenden könnten. Anonyme Klassen lassen sich einfach erstellen und wie ein normales Objekt verwenden. Hier ist ein Beispiel aus der Dokumentation.
Vor PHP 7
class MyLogger { public function log($msg) { print_r($msg . "\n"); } } $pusher->setLogger( new MyLogger() );
Mit anonymer Klasse:
$pusher->setLogger(new class { public function log($msg) { print_r($msg . "\n"); } });
Anonyme Klassen sind beim Unit-Testen nützlich, insbesondere beim Spotten von Testobjekten und Diensten. Dies hilft uns, umfangreiche Mocking-Bibliotheken und -Frameworks zu vermeiden, indem wir ein einfaches Objekt erstellen, das die Schnittstelle bereitstellt, die wir mocken möchten.

CSPRNG-Funktionen
Zwei neue Funktionen zum Generieren kryptografisch sicherer Zeichenfolgen und Ganzzahlen wurden hinzugefügt.
random_bytes(int $len);
Gibt eine zufällige Zeichenfolge mit der Länge $len
zurück.
random_int(int $min, int $max);
Gibt eine Zahl zwischen $min
und $max
zurück.
Unicode-Codepoint-Escape-Syntax
Im Gegensatz zu vielen anderen Sprachen hatte PHP vor PHP 7 keine Möglichkeit, einen Unicode-Codepunkt in String-Literalen zu maskieren, . Diese Funktion fügt die Escape-Sequenz \u
hinzu, um solche Zeichen mit ihrem UTF-8-Codepunkt zu erzeugen. Dies ist besser als das direkte Einfügen der Zeichen und ermöglicht eine bessere Handhabung von unsichtbaren Zeichen sowie von Zeichen, die dieselbe grafische Darstellung, aber unterschiedliche Bedeutung haben.
echo "\u{1F602}"; // outputs ‚
Beachten Sie, dass dies bestehenden Code mit der \u
-Sequenz unterbricht, da es das Verhalten ändert.
Generatoren werden aufgerüstet
Generatoren in PHP bekommen auch einige nette zusätzliche Features. Jetzt haben Generatoren eine return-Anweisung, mit der sie nach der Iteration einen endgültigen Wert ausgeben können. Dies kann verwendet werden, um zu überprüfen, ob der Generator fehlerfrei ausgeführt wurde, und ermöglicht es dem Code, der den Generator aufgerufen hat, verschiedene Szenarien angemessen zu handhaben.
Außerdem können Generatoren Ausdrücke von anderen Generatoren zurückgeben und liefern. Dadurch können sie komplexe Vorgänge in einfachere und modulare Einheiten aufteilen.
function genA() { yield 2; yield 3; yield 4; } function genB() { yield 1; yield from genA(); // 'genA' gets called here and iterated over yield 5; return 'success'; // This is a final result we can check later } foreach (genB() as $val) { echo "\n $val"; // This will output values 1 to 5 in order } $genB()->getReturn(); // This should return 'success' when there are no errors.
Erwartungen
Erwartungen sind eine Erweiterung der Funktion assert()
, während die Abwärtskompatibilität gewahrt bleibt. Sie ermöglichen Nullkosten-Assertionen im Produktionscode und bieten die Möglichkeit, benutzerdefinierte Ausnahmen auszulösen, wenn die Assertion fehlschlägt, was während der Entwicklung nützlich sein kann.
assert()
wird in PHP 7 zu einem Sprachkonstrukt. Assertionen sollten nur zu Debugging-Zwecken in Entwicklungs- und Testumgebungen verwendet werden. Um sein Verhalten zu konfigurieren, werden uns zwei neue Direktiven zur Verfügung gestellt.
-
zend.assertions
-
1
: Code generieren und ausführen (Entwicklungsmodus) (Standardwert) -
0
: generiert den Code, springt aber zur Laufzeit um ihn herum -
-1
: Generiert keinen Code, der ihn zum Nulltarif macht (Produktionsmodus)
-
-
assert.exception
-
1
: auslösen, wenn die Assertion fehlschlägt, entweder durch Auslösen des als Ausnahme bereitgestellten Objekts oder durch Auslösen eines neuen AssertionError- Objekts, wenn keine Ausnahme bereitgestellt wurde -
0
: Verwenden oder generieren Sie ein Throwable wie oben beschrieben, generieren Sie jedoch nur eine Warnung basierend auf diesem Objekt, anstatt es zu werfen (kompatibel mit dem Verhalten von PHP 5).
-
Vorbereitung auf den Umstieg von PHP 5 auf PHP 7
Die Einführung einer Hauptversion bietet die Möglichkeit, ältere Funktionalitäten zu ändern/aktualisieren oder sie sogar zu entfernen, wenn sie als zu alt erachtet werden oder seit einiger Zeit veraltet sind. Solche Änderungen können zu Kompatibilitätsunterbrechungen in älteren Anwendungen führen.
Ein weiteres Problem, das sich aus solchen Versionssprüngen ergibt, ist, dass wichtige Bibliotheken und Frameworks, auf die Sie angewiesen sind, möglicherweise noch nicht aktualisiert wurden, um die neueste Version zu unterstützen. Das PHP-Team hat versucht, die neuen Änderungen so abwärtskompatibel wie möglich zu gestalten und die Migration auf die neue Version so einfach wie möglich zu gestalten. Neuere und aktuellere Apps sollten es einfacher finden, auf die neue Version umzusteigen, während ältere Apps möglicherweise entscheiden müssen, ob die Vorteile die Kosten überwiegen, und sich möglicherweise dafür entscheiden, nicht zu aktualisieren.
Die meisten Unterbrechungen sind geringfügig und können leicht gemildert werden, während andere möglicherweise mehr Aufwand und Zeit erfordern. Wenn Sie vor der Installation von PHP 7 Verfallswarnungen in Ihrer Anwendung hatten, werden Sie wahrscheinlich Fehler erhalten, die die Anwendung beschädigen, bis sie behoben sind. Du wurdest gewarnt, oder?
Alte SAPIs und Erweiterungen
Am wichtigsten ist, dass alte und veraltete SAPIs wie die mysql
-Erweiterung entfernt wurden (aber Sie sollten diese überhaupt nicht verwenden, oder?). Eine vollständige Liste der Erweiterungen und entfernten Features finden Sie in diesen RFCs hier und hier.
Darüber hinaus werden weitere SAPIs auf PHP 7 portiert.
Einheitliche Variablensyntax
Dieses Update hat einige Änderungen zugunsten der Konsistenz für Variable-Variable-Konstruktionen vorgenommen. Dies ermöglicht fortgeschrittenere Ausdrücke mit Variablen, führt jedoch in einigen anderen Fällen zu Verhaltensänderungen, wie unten gezeigt.
// old meaning // new meaning $$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz'] $foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz'] $foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']() Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']()
Dies würde das Verhalten von Anwendungen beeinträchtigen, die auf solche Werte zugreifen. Auf der anderen Seite können Sie einige nette Sachen wie diese machen:.
// Nested () foo()(); // Calls the return of foo() $foo->bar()(); // IIFE syntax like JavaScript (function() { // Function body })(); // Nested :: $foo::$bar::$baz
Alte Style-Tags entfernt
Die öffnenden/schließenden Tags <% ... %>
, <%= ... %>
, <script language="php"> ... </script>
werden entfernt und sind nicht mehr gültig. Sie durch die gültigen zu ersetzen, sollte einfach sein, aber was machst du überhaupt damit, Weirdo?
Ungültige Namen für Klassen, Schnittstellen und Eigenschaften
Durch Zusätze wie Parameter und Rückgabetypen entstandene Klassen, Interfaces und Traits dürfen nicht mehr die folgenden Namen haben:
- bool
- int
- schweben
- Schnur
- Null
- wahr
- falsch
Diese verursachen Brüche bei bestehenden Anwendungen und Bibliotheken, die sie verwenden, aber sie sollten einfach zu beheben sein. Auch wenn sie keinen Fehler verursachen und gültig sind, sollten die folgenden nicht verwendet werden, da sie für die zukünftige Verwendung reserviert sind:
- Ressource
- Objekt
- gemischt
- numerisch
Wenn Sie sie nicht verwenden, sollten Sie sich die Arbeit ersparen, sie in Zukunft zu ändern.
Eine vollständige Liste der Änderungen, die die Kompatibilität beeinträchtigen würden, finden Sie in diesem Dokument.
Sie können auch php7cc verwenden, das Ihren Code überprüft und potenzielle Probleme erkennen kann, die auftreten können, wenn Sie zu PHP 7 wechseln. Aber natürlich gibt es keinen besseren Weg, als PHP 7 zu installieren und sich selbst davon zu überzeugen.
Mögliche Kompatibilitätsprobleme mit PHP 7
Kompatibilität der PHP 7-Infrastruktur
Viele Hosting-Dienste haben damit begonnen, Unterstützung für PHP 7 hinzuzufügen. Dies sind gute Nachrichten für Shared-Hosting-Anbieter, da die Leistungssteigerungen es ihnen ermöglichen, die Anzahl der Client-Websites auf ihrer Hardware zu erhöhen, ihre Betriebskosten zu senken und ihre Margen zu steigern. Die Kunden selbst sollten unter diesen Bedingungen keinen allzu großen Schub erwarten, aber fairerweise ist Shared Hosting sowieso keine leistungsorientierte Wahl.
Auf der anderen Seite werden Dienste, die virtuelle private Server oder dedizierte Server anbieten, die vollen Vorteile dieser Leistungssteigerung ernten. Einige PaaS-Dienste wie Heroku unterstützten PHP 7 schon früh, aber andere Dienste wie AWS Beanstalk und OpenShift von Oracle hinken hinterher. Sehen Sie auf der Website Ihres PaaS-Anbieters nach, ob PHP 7 bereits unterstützt wird oder in naher Zukunft unterstützt wird.
IaaS-Anbieter erlauben Ihnen natürlich, die Kontrolle über die Hardware zu übernehmen und PHP 7 zu installieren (oder zu kompilieren, wenn Ihnen das lieber ist). PHP 7-Pakete sind bereits für große IaaS-Umgebungen verfügbar.
PHP 7-Softwarekompatibilität
Neben der Infrastrukturkompatibilität müssen Sie auch potenzielle Softwarekompatibilitätsprobleme berücksichtigen. Beliebte Content-Management-Systeme wie WordPress, Joomla und Drupal haben mit ihren neuesten Versionen Unterstützung für PHP 7 hinzugefügt. Große Frameworks wie Symfony und Laravel genießen ebenfalls volle Unterstützung.
Es ist jedoch Zeit für ein Wort der Vorsicht. Diese Unterstützung erstreckt sich nicht auf Code von Drittanbietern in Form von Add-Ons, Plugins, Paketen oder wie auch immer Ihr CMS oder Framework sie nennt. Sie können unter Kompatibilitätsproblemen leiden und es liegt in Ihrer Verantwortung, sicherzustellen, dass alles für PHP 7 bereit ist.
Für aktive, gepflegte Repositories sollte dies kein Problem sein. Ältere und nicht gepflegte Repositories ohne PHP 7-Unterstützung können jedoch Ihre gesamte App unbrauchbar machen.
Die Zukunft von PHP
Die Veröffentlichung von PHP 7 entfernte alten und veralteten Code und ebnete den Weg für neue Funktionen und Leistungsverbesserungen in der Zukunft. Außerdem wird erwartet, dass PHP bald weitere Leistungsoptimierungen erhält. Trotz einiger Kompatibilitätsbrüche mit früheren Versionen sind die meisten Probleme einfach zu lösen.
Bibliotheken und Frameworks migrieren jetzt ihren Code auf PHP 7 und stellen damit die neuesten Versionen zur Verfügung. Ich ermutige Sie, es auszuprobieren und die Ergebnisse selbst zu sehen. Vielleicht ist Ihre Anwendung bereits kompatibel und wartet darauf, PHP 7 zu verwenden und davon zu profitieren.