Unterschiede zwischen PHP 5 und PHP 7
In diesem Blogbeitrag wollen wir uns damit beschäftigen, welche Unterschiede es zwischen PHP 5 und PHP 7 gibt. Der Blogbeitrag beginnt mit einer kurzen Hintergrundeinführung, gefolgt von den Änderungen, über die neuen Features und Funktionen bis hin zu den entfernten Features und Funktionen.
Hintergrundinformationen
PHP ist eine Skriptsprache, die erstmals 1995 vorgestellt wurde. Mit PHP 3 wurde der komplette Programmkern überarbeitet und der Grundstein für die heutigen Versionen gelegt. Eine weitere wichtige Version wurde mit PHP 5 geschaffen.
Die erste Version von PHP 5 wurde im Sommer 2004 veröffentlicht. PHP 5 brachte hierbei nicht nur performance-technische Verbesserungen, sondern auch einige Erweiterungen. PHP 5 hat jedoch auch innerhalb seiner Hauptversion einige Meilensteine hingelegt. Eine Version mit vielen Änderungen und vor allem auch Erweiterungen war unter anderem die Version 5.3. Bis heute wird auf einer Vielzahl an Servern PHP 5 eingesetzt. Die aktuellste Version von PHP 5 ist PHP 5.6. Für PHP 5.6 ist der aktive Support seit Anfang 2017 eingestellt, doch es werden noch Sicherheitsupdates in unregelmäßigen Abständen veröffentlicht.
Als Nachfolger von PHP 5 gilt PHP 7, dessen erste Version Ende 2015 veröffentlicht wurde. Ursprünglich war PHP 6 als Nachfolger von PHP 5 geplant, der PHP 5 schon relativ schnell ablösen sollte. Auf Grund von Problemen bei der Implementierung wurde die Entwicklung jedoch 2010 eingestellt. Im Jahr 2014 wurde dann entschieden, dass PHP 7 der neue Nachfolger von PHP 5 werden soll. Die Unterstützung von PHP 7 bei den Hosting-Providern ist in letzter Zeit stetig gestiegen und in der Zwischenzeit sehr hoch. Einige Provider bieten jedoch die Möglichkeit, zwischen PHP 5 und PHP 7 zu wählen.
Änderungen von PHP 5 zu PHP 7
Änderungen an PHP-Funktionen, zu mindestens die, die für den Benutzer direkt sichtbar sind, wurden zwischen den Versionen PHP 5 und PHP 7 so gut wie nicht durchgeführt. Die paar kleinen Änderungen, die durchgeführt wurden, können in der offiziellen Migrations-Dokumentation von PHP nachgelesen werden. Diese sind aber, wie bereits erwähnt, selbst für fortgeschrittene PHP-Programmierer meist nicht von Bedeutung.
Durch Änderungen an der Implementierung von PHP, darunter auch am PHP-Kern, bietet uns PHP 7 jedoch eine deutlich verbesserte Laufzeit (teilweise bis zu über 100%) und einen verminderten Bedarf an Speicherplatz.
Neue Features und Funktionen
In diesem Abschnitt wollen wir einige Features und Funktionen vorstellen, die mit PHP 7 eingeführt wurden.
Operator für Drei-Wege-Vergleich
Oftmals kann es notwendig sein, einen Drei-Wege-Vergleich (engl. three-way comparison) durchzuführen. Benötigt wird dies z. B. bei Vergleichsfunktionen (wie z. B. bei usort()
, uksort()
und uasort()
), die entweder -1
, 0
oder 1
als Wert zurückgeben müssen, abhängig davon, ob das Element A kleiner, gleich oder größer dem Element B ist.
Benötigt man eine solche Funktionalität in PHP 5 (oder älteren Versionen), so schreibt man sich hierfür am besten eine eigene kleine Hilfsfunktion:
<?php function compare($a, $b) { if ($a < $b) return -1; else if ($a == $b) return 0; else return 1; } echo compare(3, 4); echo "<br />"; echo compare(4, 4); echo "<br />"; echo compare(4, 3); ?>
In PHP 7 gibt es hierfür den Spaceship Operator <=>
. Dieser Operator führt den gleichen Vergleich wie die obige Funktion compare()
aus. Der Code sieht dann also wie folgt aus:
<?php echo 3 <=> 4; echo "<br />"; echo 4 <=> 4; echo "<br />"; echo 4 <=> 3; ?>
Operator für Null-Vergleich
Gerade wenn es darum geht, ob ein Formularparameter, welcher über GET oder POST übertragen wurde, gesetzt ist oder nicht, wird oft die Funktion isset()
verwendet. isset()
überprüft dabei, ob die Variable gesetzt ist und dessen Wert ungleich null
ist.
Um eine möglichst kurze Schreibweise zu erhalten, wird deshalb oft der ternäre Operator ?
verwendet. Ein geläufiges Beispiel für PHP 5 sieht dann wie folgt aus:
<?php echo isset($_GET["Benutzer"]) ? $_GET["Benutzer"] : "Gast"; ?>
Mit PHP 7 wurde der Null Coalescing Operator ??
eingeführt. Dieser Operator prüft, ob die angegebene Variable existiert und ungleich dem Wert null
ist. Ist dies der Fall, so wird der Wert vor dem Operator ??
zurückgegeben, andernfalls wird der Wert hinter dem doppelten Fragezeichen zurückgeben. Das folgende Beispiel ist zu dem obigen äquivalent:
<?php echo $_GET["Benutzer"] ?? "Gast"; ?>
Anonyme Klassen
Bisher mussten Klassen zuerst mit Hilfe des Schlüsselworts class
deklariert werden, bevor dann ein Objekt davon instanziiert werden konnte. Mit PHP 7 wurden die sogenannten anonymen Klassen integriert, d. h. es wird einfach nur eine Klasse definiert, die keinen Namen hat, aus der dann ein Objekt instanziiert wird. Bei der Notation werden lediglich die Schlüsselwörter new class
gefolgt von der Klassendefinition angegeben. Daraus ergibt sich dann ein sogenanntes anonymes Objekt. In einigen Situationen kann ein solches Konstrukt sinnvoll sein, jedoch lässt sich dies pauschal nicht definieren. Hier ein Beispiel, das die Verwendung einer anonymen Klasse zeigt:
<?php $math = new class { function add($a, $b) { return $a + $b; } function sub($a, $b) { return $a - $b; } function mul($a, $b) { return $a * $b; } function div($a, $b) { return $a / $b; } }; echo $math->add(3, 2); echo "<br />"; echo $math->sub(3, 2); echo "<br />"; echo $math->mul(3, 2); echo "<br />"; echo $math->div(3, 2); ?>
Division von Ganzzahlen
Eine neue praktische Funktion in PHP 7 ist intdiv()
. Die Funktion intdiv()
führt die Division von zwei Ganzzahlen durch und gibt das Ergebnis als Ganzzahl zurück. Das folgende Beispiel zeigt den Unterschied, beim Teilen von zwei Ganzzahlen zwischen dem Divisionsoperator /
und der Funktion intdiv()
:
<?php echo 6 / 4; echo "<br />"; echo intdiv(6, 4); ?>
Entfernte Funktionen
Mit PHP 7 wurden auch einige abwärtsinkompatible Änderungen durchgeführt. In diesem Abschnitt wollen wir Ihnen die wichtigsten Änderungen zeigen und was man dagegen tun kann.
Nummerische Zeichenkette in hexadezimaler Schreibweise
Bei Vorgängerversionen von PHP 7 wurden Zeichenketten die eine Zahl in hexadezimaler Schreibweise enthalten als nummerisch angesehen. Ein Aufruf wie is_numeric("0x01")
hat also den Wert true
zurückgegeben. Seit PHP 7 wird hier jedoch false
zurückgegeben. Das folgende Beispiel zeigt unter anderem die Addition von zwei Hexadezimalzahlen. Bei PHP 5 wird hier der Wert 5
ausgegeben - bei PHP 7 hingegen 0
.
<?php echo ("2" + "3"); echo "<br />"; echo ("0x02" + "0x03"); ?>
Funktionen für reguläre Ausdrücke
Seit PHP 5.3 sind die POSIX-Funktionen für reguläre Ausdrücke als veraltet gekennzeichnet. Mit PHP 7 wurden diese Funktionen aus dem Sprachumfang entfernt. Stattdessen sollten die PCRE-Funktionen verwendet werden. Diese sind ebenfalls bereits seit PHP 4 im Sprachumfang enthalten. Die folgende Tabelle zeigt, welche POSIX-Funktionen es gibt und durch welche PCRE-Funktionen diese unter PHP 7 zwingend ersetzt werden müssen:
POSIX-Funktion | PCRE-Funktion | Hinweis |
---|---|---|
ereg() | preg_match() | - |
eregi() | preg_match() | mit dem Parameter i |
ereg_replace() | preg_replace() | - |
eregi_replace() | preg_replace() | mit dem Parameter i |
split() | preg_split() | - |
split() | preg_split() | mit dem Parameter i |
sql_regcase() | preg_match() oder preg_quote() | - |
Datenbank-APIs
Mit PHP 7 wurden die Datenbank-APIs mysql
und mssql
entfernt.
Die Extension mysql
gibt es bereits seit der PHP-Version 2, wurde jedoch mit PHP 5.5 als veraltet gekennzeichnet. Schon damals empfahlen die Entwickler von PHP, auf die neue Extension mysqli
oder die API PDO
umzusteigen. Mit PHP 7 wurde nun die Extension mysql
endgültig entfernt. Die Extension mysqli
sowie die API PDO
stehen weiterhin unter aktiver Weiterentwicklung und können auch in PHP 7 ohne Bedenken verwendet werden.
Für den Zugriff auf einen SQL-Server von Microsoft konnte mit PHP 5 noch die Extensions mssql
und sqlsrv
sowie die API PDO
verwendet werden. Die Extension mssql
ist eine Schnittstelle, die von freien Entwicklern bzw. der PHP-Community entwickelt wurde. sqlsrv
hingegen ist die von Microsoft entwickelte Schnittstelle zur Kommunikation mit dem SQL-Server von Microsoft über PHP. Mit PHP 7 wurde nun die Extension mssql
vollständig entfernt. Als Alternative kann entweder die Extension sqlsrv
oder die API PDO
verwendet werden.