Zum Hauptinhalt springen

Änderungen in PHP 7

PHP 7

PHP steht für Hypertext Preprocessor und existiert seit Mitte der Neunziger Jahre. Damals besaß es noch dem Namen Personal Home Page Tools. PHP wird auf vielen Webservern eingesetzt. Im Jahr 2004 erschien die Version 5 und diese hielt sich sehr lange Zeit (mit Zwischenversionen) bis 2015.

PHP wird regelmäßig mit Updates versorgt. Aktuell ist die Version 7, die 2015 veröffentlicht wurde. Mit Ihr gab es einige Änderungen. Vieles hat sich verbessert. So ist PHP in Version 7 nun deutlich schneller geworden.

Mit PHP 7 wurden einige Funktionen aber auch entfernt. Dies war schon lange angekündigt. Auch bei Betriebssystemen werden nicht nur Funktionen hinzugefügt. Mit der Zeit werden neue Möglichkeiten gefunden, die ältere Funktionen ersetzen. Warum sollte die alten noch ewig in neuen Versionen implementiert werden?

So hat es sich auch die PHP-Community gedacht und alte Funktionen, die schon lange als deprecated eingestuft waren, nun aus PHP entfernt. Für viele Funktionen gibt es Ersatz. In den meisten Fällen ist dieser einfacher und bietet viel mehr Möglichkeiten.

Geändertes Error-Exception Handling

Mit PHP 7 werden Fehler nicht mehr wie früher bekanntgemacht. Es werden nun Exceptions geworfen. Genauer gesagt ist ein Error-Objekt ein spezialisiertes Throwable-Objekt. Die Klassen Error und Exception sind beides abgeleitete Klassen von Throwable auf gleicher Ebene. Um Exception– und Error-Objekte gleichzeitig abzufangen, müssen Sie die gemeinsame Oberklasse Throwable nutzen. Eine kurze Übersicht der Klassenstruktur verdeutlicht die Probleme in PHP 7 (gegenüber früheren Versionen).

-Throwable
--Exception
---Exception-Unterklassen
--Error
---Error-Unterklassen wie ParseError

Exceptions werden nun auch geworfen, wenn ein Objekt nicht initialisiert werden kann. Früher gaben einige (nicht alle) Konstruktoren NULL zurück, dies ist mit PHP 7 nun Geschichte.

Wenn eine Zeichenkette nicht geparst werden kann, wird ein ParseError (abgeleitete Klasse von Error) geworfen. Um die Funktion eval() sauber zu nutzen, ist mit PHP 7 nun ein catch-Block nötig.

Geänderte Reihenfolge beim indirekten Aufruf

Der indirekte Aufruf von Eigenschaften, Variablen und Methoden wird in PHP 7 strikt von links nach rechts ausgeführt. In PHP 5 gab es teilweise Sonderregelungen.

Expression in PHP 7
$$foo[‚bar‘][‚baz‘] ($$foo)[‚bar‘][‚baz‘]
$foo->$bar[‚baz‘] ($foo->$bar)[‚baz‘]

Geänderte List-Funktion

Sie nutzen die list-Funktion? Sie haben sich schon immer gewundert, warum die Elemente in falscher Reihenfolge (bei einem Array) eingefügt worden sind? Mit PHP 7 ändert sich das Verhalten.

Die Anweisung

list($a[], $a[], $a[]) = [1, 2, 3];

war in PHP 5 identisch zu

array(3, 2, 1)

Mit PHP 7 ist die Reihenfolge nun wie folgt:

array(1, 2, 3)

Weiterhin darf eine list()-Anweisung nicht mehr leer sein. Die Anweisungen

list() = $a;
list(,,) = $a;

sind in PHP 7 nicht mehr erlaubt.

Änderungen beim global-Statement

Global darf nur noch bei einfachen Variablen genutzt werden. Das alte Verhalten aus PHP 5 kann durch geschweifte Klammern aber wieder genutzt werden:

Aus

global $$foo->bar;

wird in PHP 7

global ${$foo->bar};

Änderungen zu foreach

Der interne Array-Pointer wird in PHP 7 in der Schleife nicht mehr verändert. Die Anweisungen:

$array = [0, 1, 2];
foreach ($array as &$val) {
    var_dump(current($array));
}

führen in PHP 7 zur folgenden Ausgabe:

int(0)
int(0)
int(0)

Wird innerhalb der foreach-Schleife ein weiteres Objekt dem Array hinzugefügt, so wird dieses ebenfalls benutzt. Die folgende Schleife würde in PHP 7 zweimal durchlaufen. (In PHP 5 nur einmal, da die Änderung am Array in der vorletzten Zeile nicht innerhalb der Schleife erkannt werden):

$array = [0];
foreach ($array as &$val) {
    var_dump($val);
    $array[1] = 1;
}

Änderungen bei Strings

In PHP 5 wurden Hexadezimalcodes als Zahlen angesehen. Dies funktioniert so in PHP 7 nicht mehr. Beide folgenden Ausgaben ergeben false.

var_dump("0x123" == "291");
var_dump(is_numeric("0x123"));

Wenn Sie einen String überprüfen möchten, ob dieser einen Hexadezimalcode darstellt, können Sie die Funktion filter_var() nutzen. Diese Funktion erlaubt Ihnen auch das Umwandeln in einen Integer:

$intFromString = filter_var("0xff0000", FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX);
if ($intFromString === false) {
    throw new Exception("Keine Integer-Zahl!");
}

In PHP 7 können Sie nun leichter Unicode-Zeichen nutzen. Sie müssen das Zeichen nur mit \u{ und } maskieren. Wenn Sie innerhalb eines Strings die Zeichenkette \u{ nicht für ein Unicode-Zeichen nutzen, müssen Sie den Schrägstrich natürlich maskieren.

Entfernte Funktionen

In PHP 7 wurden einige Funktionen entfernt. In der Regel traf es Funktionen, die als deprecated in PHP 5 ausgewiesen waren.

Beispielsweise sind alle ereg-Funktionen entfallen. Als Ersatz dient nun PCRE.

Auch die Datenbankfunktionen mysql- und die mssql-Funktionen gibt es nicht mehr in PHP 7.

Weitere Änderungen

Mehrfachentscheidungen (Switch) dürfen maximal einen Default-Zweig enthalten. Sollten es doch mehr sein, so wird nun ein E_COMPILE_ERROR ausgegeben.

Klassen und Schnittstellen dürfen in PHP 7 folgende Namen nicht mehr haben:

  • bool
  • int
  • float
  • string
  • NULL
  • TRUE
  • FALSE

Zudem rät THE PHP GROUP, folgende Namen nicht mehr zu nutzen:

  • resource
  • object
  • mixed
  • numeric

Sie sehen also, schnell einmal zwischen Tür und Angel PHP auf Version 7 zu aktualisieren, ist eventuell ein schlechter Plan. Lange sollten Sie sich aber nicht für ein Update Zeit nehmen. PHP 5.5 wird schon gar nicht mehr weiter entwickelt. Sicherheitsaktualisierungen gibt es auch nicht mehr.

Ähnlich ist es mit der letzten PHP 5 Version. Ab dem nächsten Jahr wird es auch keine regulären Updates mehr für PHP 5.6 geben. Bis Ende 2018 wird es für PHP 5.6 noch Sicherheitsaktualisierungen geben. Danach ist endgültig Schluss. Spätestens dann sollten Sie auf PHP 7 aktualisieren, um Angreifern keine Chance zu geben. Oder möchten Sie einen unsicheren Webserver betreiben, der auch Ihren Kunden Probleme bereitet?

Wenn Sie noch keine Erfahrungen mit PHP haben, oder Ihr Wissen auffrischen möchten, bieten wir Ihnen unser PHP-Seminar an.

Kommentar schreiben

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Ein Gedanke zu “Änderungen in PHP 7”

  • Michael Schulze
    Geschrieben am 11. Dezember 2018 um 18:25

    Weniger ein Kommentar. als eine Frage: ist die Einschränkungen bei msqli INSERT gegenüber der früheren Version bezüglich Pflichtangabe und Pflichtbeschickung ALLER Spalten eher zufällig oder gewollt? Was wird damit bezweckt?