Neues in PHP 7

saftmeister

Nutze den Saft!
Ich hatte bereits einen Ausblick auf PHP 5.5 geschrieben, jetzt kommt PHP 7 dran.

PHP 7 ist ein neues Major Release, das bedeutet, jede Menge neue Features, abschneiden von alten Zöpfen und was sich sonst noch geändert hat.

Eines Vorweg: PHP 7 wird doppelt!!! so schnell laufen wie PHP 5.6. Schon das allein sollte Grund genug sein, auf die neue Version zu wechseln. Doch zunächst, was nicht mehr funktioniert:
  • (Short-)Tags wurden entfernt. Die Erkennung für die Tags <% und <script language="php"> wurde entfernt.
  • Die Erweiterung ereg wurde entfernt, statt dessen die preg-Extension verwenden.
  • Die Erweiterung mysql wurde nun endlich entfernt, statt dessen PDO oder MySQLi verwenden.
  • Funktion split() wurde entfernt, statt dessen sollte nun explode() verwendet werden.
  • Warnung entfernt, wenn date.timezone nicht gesetzt ist. Standard für diese Einstellung ist schon seit jeher UTC.

Veraltet gekennzeichnet:
  • PHP4-Konstruktoren sind als veraltet gekennzeichnet. Klassen-Methoden, die als Namen den der Klasse verwenden, sind in PHP7 noch als Konstruktoren verwendbar - zusätzlich zu __construct(). In PHP 8 werden diese Funktionen nicht mehr als Konstruktoren anerkannt.

Was wurde geändert:
  • Es wurde die Uniform Variable Syntax eingeführt. Die Reihenfolge in der eingebettete Variablennamen-Auflösungen durchgeführt werden, ist jetzt links-nach-rechts. In PHP 5.6 und früher war dies rechts-nach-links. Beispiel:
PHP 5.6: $a->$b['c'] => zuerst wird $b['c'], danach das Ergebnis davon an $a-> angehängt.
PHP 7: Zuerst wird $a->$b aufgelöst, danach das Ergebnis mit ['c'] komplettiert.
Um dieses Verhalten wieder auf den alten Zustand zu bringen, ist das Setzen von geschweiften Klammern notwendig.

Dieses Verhalten gilt sowohl für Variablen als auch Funktionsaufrufe.​
  • T_PAAMAYIM_NEKUDOTAYIM gibt es nicht mehr wirklich, eingebettete Funktionsaufrufe (zB. Funktionsnamen in Variablen mit anschließender Parameter-Liste wirft diesen Fehler nun nicht mehr. Beispiel:
PHP:
// Funktioniert auch in PHP 5.6
$a = "sprintf";
echo $a("%d\n", 5);


// Funktioniert ab PHP 7
function a()
{
    return "sprintf";
}
echo a()("%d mal fump", 7);
Das ist neu:
  • Engine Exceptions eingeführt; Sog. Recoverable Errors, Warnings und Notices führen jetzt zu einer entsprechenden Exception, die abgefangen und behandelt werden kann. E_CORE_ERROR, E_COMPILE_ERROR und E_PARSE werden (zunächst) nicht als Exceptions verfügbar sein.
  • Throwable Interface wird eingeführt. Da die zuvor genannten neuen Exceptions nicht von der Klasse "Exception" ableiten, sondern von einer neuen Klasse "BaseException", wird eine Schnittstelle notwendig, um alle Exception-Typen unter einem Begriff zusammen zu fassen.
  • Zufallsfunktionen für den täglichen Gebrauch; Es sind zwei neue Funktionen eingebaut, mit denen man einen zufälligen String (random_bytes()), sowie eine zufällige Zahl aus einem vorgegebenen Bereich (random_int()) generieren lassen kann.
  • Anonyme Klassen werden eingeführt. Eine anonyme Klasse ist eine solche, welche direkt zur Laufzeit generiert und ein Objekt daraus erzeugt wird. Dies kann insbesondere für Callbacks angewendet werden.
  • Diverse neu reservierte Schlüsselworte
  • Datentypen für skalare Werte; Einfache Datentypen, wie String, Integer, Float, etc. können nun über einen strikten Modus erzwungen werden, bei dem eine Exception geworfen wird, wenn der übergebene Wert nicht dem erwarteten Typen entspricht.

In zweiten Teil dieses Threads gibt es noch mehr neues.
 

saftmeister

Nutze den Saft!
Teil 2 (noch nicht komplett, muss aber mal Speichern):

Das fällt weg:

  • Einige Server-APIs und Erweiterungen (zusätzlich zu ext/mysql und ext/ereg), die als tot anerkannt sind, werden entfernt. Da es zu viele sind, sollte jeder einen Blick in das RFC werfen.
  • Support von Zeichenketten bei list(). Das Verhalten von list() in Kombination mit Zeichenketten ist nicht konsequent, daher wurde der Support dafür komplett entfernt. Statt dessen soll list() dort stärker sein, wofür es entworfen wurde: dem Einsatz bei Arrays.

Das ändert sich:

  • ext/json wird zu ext/jsond. Grund ist, dass ext/json nicht unter einer freien Lizenz steht, was einige Distributionen davon abhält, es mit zu liefern.
  • Zusätzlicher Parameter für json_encode, um Gleitkomma-Zahlen zu erzwingen.
  • Im Unterbau: Schnelle Parameter-Parsing-Schnittstelle. Wenn jemand sich ausschließlich mit der Sprache selbst und nicht dem Innenleben beschäftigt, findet diesen RFC möglicherweise langweilig. Aber eines am Rande: Damit beschleunigt sich die Ausführung von PHP-Code um einiges, immerhin 2,5% weniger Zeit.
  • Nativer Thread-Lokaler-Speicher (TLS): Möglicherweise ist der ausgeführte Code auf Thread-Safety-Runtimes etwas schneller als bisher, jedoch mindestens genauso schnell. Es handelt sich eher um eine interne Verbesserung der Wartung des Codes und Stabilität.
  • Umbau-Arbeiten am Verhalten von Integer-Werten. Bisher gibt es ein paar unstimmige Platform-Abhängigkeiten, die mit dem neuen Release gerade gezogen werden. Zu dem gibt es auch Änderungen beim Verhalten von Überläufen bei Zahlen.
  • Anpassung an die Gegebenheiten eines 64-Bit-Systems. Dadurch ist der volle Adress-Raum einer 64-Bit-Anwendung garantiert, mit allen seinen positiven und negativen Konsequenzen. Zahlen können größer, Zeichenketten länger sein.
  • session_start() bekommt ein paar Konfigurationsparameter. Dadurch kann man das Laufzeitverhalten von Sessions besser steuern und einige Geschwindigkeitsverbesserungen heraus kitzeln.

Das gibt es neu:

  • Spaceship-Operator: Mit diesem Operator können Vergleiche (wie ==, <=, =>, etc) gezogen werden, und er liefert statt einem true oder false eine positive, negative Zahl oder 0 zurück und verhält sich damit so ähnlich wie strcmp().
  • Rückgabe-Werte von Funktionen: Es ist nun möglich, den Typ der Rückgabe einer Funktion zu erzwingen. Sollte ein anderer Typ als der erzwungene zurück gegeben werden, wird ein E_RECOVERABLE_ERROR geworfen, was laut dem ersten Teil zu einer entsprechenden Exception führt.
  • Unicode-Escaping: Es ist nun möglich, Zeichen aus dem Unicode-Zeichensatz im String zu erzwingen.
  • Null-Coalesce-Operator: Viele haben ihn schon mal gesehen, einige nutzen ihn täglich: den ternären Operator. Jetzt bekommt er einen Bruder, der sich auf die Code-Lesbarkeit auswirkt: den Operator "??". Beispiel:
PHP:
$pageid = isset($_GET['pageid']) ? $_GET['pageid'] : 0;

// verhält sich genauso wie

$pageid = $_GET['pageid'] ?? 0;

  • Abstrakter Syntax-Baum: Auch hier wieder ein Feature, was sich auf die Geschwindigkeit auswirkt. Wem es nicht zu technisch ist und Interesse am Unterbau von PHP hat, sollte sich das RFC mal durchlesen. Für die anderen: Gibt Gummi und spart Sprit ;-)
  • Nicht-statischer Aufruf einer Closure. Die Verwendung von anonymen Funktionen (Closures) bekommt jetzt ein Feature, das einige bestimmt schon vermisst haben. Es wirkt sich auf die Qualität und auch ein klein wenig auf die Geschwindigkeit des Codes bei Verwendung von Closures mit mehreren Aktionen auf dem selben Objekt aus.
  • Abfangbare Exception bei einem Aufruf einer Methode auf einem Nicht-Objekt (oder kurz: NullPointerException)
  • Filterbares unserialize(): Unerwünschte Daten können nun bei unserialize() entfernt werden. Es gibt einen neuen Parameter, mit dem man steuern kann, welche Objekte (anhand des Klassennamens) bei unserialize() nicht mehr de-serialisiert werden sollen.
  • Neue Klasse IntlChar für ext/intl: Damit kann man Unicode-Zeichen als Objekte verwenden und entsprechend behandeln.
 
Zuletzt bearbeitet: