Aus Linux-Magazin 03/2019

Neuerungen in PHP 7.3

© Danai Chidsin, 123RF

Seit dem 6. Dezember liegt PHP in der Version 7.3 vor. Die Neuerungen wirken auf den ersten Blick wenig spektakulär, könnten aber vor allem bestehende Skripte aus dem Tritt bringen. Trotzdem sollten Website-Betreiber ins Auge fassen, möglichst bald auf die neue Version zu wechseln.

PHP 7.3 wirft nicht nur einige Altlasten über Bord, sondern bringt auch Syntax-Änderungen mit. Im Alltag dürften Programmierer vor allem den Umstieg auf PCRE2 (Perl Compatible Regular Expressions), das geänderte Verhalten in Multibyte-String-Funktionen und die flexiblere Heredoc- und Nowdoc-Syntax bemerken.

Im Hier und Jetzt

Die Heredoc-Syntax vereinfacht das Zuweisen und Ausgeben längerer Texte. Sie ersetzt Strings in Anführungszeichen (»$name = “Hans Hansen”;«) durch:

$ausgabe = <<<EOT
Ich heiße: "$name".
EOT;

Hinter dem Operator »<<<« steht dabei ein Kürzel und dann in einer neuen Zeile der eigentliche Text. Dessen Ende kennzeichnet die erneute Angabe des Kürzels. Die Heredoc-Syntax verhält sich dabei wie in Anführungsstrichen (»”«) eingeschlossener Text. Im obigen Beispiel würde »$ausgabe« den String »Ich heiße: Hans Hansen« enthalten.

Ergänzend dazu gibt es seit PHP 5.3.0 die Nowdoc-Syntax. Sie verhält sich wie in einfachen Anführungszeichen eingeschlossener Text, den PHP nicht interpretiert. Ändert der Entwickler die erste Zeile des Beispiels in »$ausgabe = <<<‘EOT’« würde »$ausgabe« den Text »Ich heiße: “$name”.« zeigen.

In älteren PHP-Versionen folgten nach dem zweiten Kürzel am Ende des Strings stets ein Semikolon und eine Leerzeile. Nicht erlaubt war etwa »EOT; echo $ausgabe;«. Mit PHP 7.3 fällt auch dieser Zwang sowohl bei Heredoc als auch Nowdoc weg. Zudem dürfen Entwickler den Text und das Kürzel endlich einrücken:

$ausgabe = <<<EOT
        Ich
                heiße:
        Hans.
        EOT;

Der PHP-Interpreter ermittelt zunächst die Anzahl der Tabulatoren beziehungsweise Leerzeichen vor dem letzten Kürzel und entfernt dann vor jeder Textzeile darüber jeweils genau so viele Tabulatoren respektive Leerzeichen. Im obigen Beispiel enthält »$ausgabe« also den Text »Ich heiße: Hans.«.

Die Fähigkeit, Heredoc- und Nowdoc-Texte einzurücken, erleichtert vor allem das Formatieren von Klassen. So erzwang die Heredoc-Syntax früher solchen Code:

class Person {
        public $name = <<<EOT
Hans Hansen
EOT;
}

Der darf dank PHP 7.3 nun so aussehen:

class Person {
        public $name = <<<EOT
        Hans Hansen
        EOT;
}

Hier wird schnell deutlich: Die zweite Schreibweise ist übersichtlicher.

Ohne Punkt – mit Komma

In Funktionsaufrufen darf nun nach dem letzten Parameter ein Komma stehen. So hängen Entwickler schnell weitere Parameter an, etwa bei folgendem Aufruf:

unset(
    $alt,
    $temp,
);

PHP-Programmierer dürfen zudem in »list()« Variablen per Referenz zuweisen. So lässt sich der Dreizeiler

$array = ["Hans", "Hansen"];
$vorname = $array[0];
$name =& $array[1];

in PHP 7.3 kurz und bündig schreiben als:

$array = [1, 2];
list($vorname, &$name) = $array;

Zuwachs

Die beiden neuen Funktionen »array_key_first()« und »array_key_last()« ermitteln den ersten beziehungsweise letzten Schlüssel in einem Array:

$name = ['hans' => 1, 'hansen' => 2];
echo array_key_first($name);

Die Funktion »hrtime()« liefert die aktuelle Systemzeit in hoher Auflösung. Meist handelt es sich um die verstrichenen Nanosekunden ab einem willkürlich festgelegten Referenzpunkt. Dann testet »is_countable()«, ob die übergebene Variable einen abzählbaren Inhalt besitzt. Dies gilt für Arrays oder Objekte, die ein »Countable«-Interface implementieren.

PHP 7.3 unterstützt ab sofort auch die Argon2id-Hashes. Dafür führt die Programmiersprache die Konstante »PASSWORD_ARGON2ID« ein. Die Funktionen »password_hash()«, »password_verify()«, »password_get_info()« sowie »password_needs_rehash()« verstehen diese Konstante. Das neue PHP veranlasst sie so, Argon2id-Hashes zu berechnen.

Tauschgeschäfte

Um zwei Strings miteinander zu vergleichen, konvertieren viele Entwickler ihren Inhalt in Groß- oder Kleinbuchstaben. Die Erweiterung für Multibyte-Strings kennt dafür gleich mehrere Funktionen. So liefert etwa »mb_strtoupper(“Straße”);« den Text »STRAßE« zurück. Das zeigt: Sonderzeichen und Umlaute bereiten mitunter Probleme, besonders mit Blick auf einen Vergleich. Neben diesem so genannten Case Mapping existiert noch die Case-Folding-Methode. Sie ersetzt einzelne Buchstaben durch andere oder sogar durch eine Zeichenfolge. Die »Straße« mutiert so zur »STRASSE«.

In der aktuellen PHP-Version bieten außerdem alle Multibyte-String-Funktionen wie »mb_strtoupper()« vollen Support für Case Mapping und Case Folding. Die Konvertierungsmethoden lassen sich mit »mb_convert_case()« auf einen String anwenden.

Funktionen, die wie »mb_strtoupper()« Groß- und Kleinschreibung eliminieren oder nicht beachten, verwenden ab sofort die Case-Folding-Methode – »mb_strtoupper(“Straße”);« liefert daher nun »STRASSE« zurück. Wie im Beispiel kann der String seine Länge ändern.

Im Hintergrund verwenden alle Multibyte-String-Funktionen das neue Unicode 11.0.0. Daneben unterstützt PHP 7.3 jetzt korrekt Multibyte-Strings, die mehr als 2 GByte Speicher belegen. Schließlich haben die PHP-Macher noch die Performance der Multibyte String Extension verbessert. Insbesondere die Funktionen, die Groß- in Kleinschreibung umwandeln, sollen jetzt deutlich flotter arbeiten.

Der neue Regulator

Die beliebte PCRE-Erweiterung erlaubt das Auswerten Perl-kompatibler regulärer Ausdrücke. PHP 7.3 mustert das alte PCRE aus und bringt ab sofort den Nachfolger PCRE2 mit. Damit ändert sich teils auch das Verhalten beim Auswerten der Regexe. So interpretiert PCRE2 Zeichenbereiche in (Zeichen-)Klassen deutlich strikter als der Vorgänger. Das merkt der PHP-Entwickler vor allem bei ungültigen Mustern. Darüber hinaus orientiert sich PCRE2 an der Unicode-Version 10.0 statt an Unicode 7.0. In PHP 7.3 maskiert zudem die Funktion »preg_quote()« jetzt auch das Zeichen »#«.

Wer einen LDAP-Server betreibt, darf frohlocken: Das neue PHP unterstützt auch LDAP-Controls. Mit diesen Objekten kommen alle Abfragefunktionen zurecht, darunter »ldap_add()« und »ldap_search()«. Zudem liest »ldap_parse_result()« im Parameter »$serverctrls« Controls von einem Server aus.

PHP 7.3 kennt das neue Flag »JSON_THROW_ON_ERROR«, das die Fehlerbehandlung von »json_decode()« und »json_encode()« verändert: Dank des neuen Flag werfen die beiden Funktionen aus der Json-Erweiterung bei einem Fehler eine Exception.

Protokollant

Der Fast-CGI Process Manager (FPM) wertet jetzt drei weitere Einstellungen aus, um das Logging besser zu steuern. Die globale Einstellung »log_limit« bestimmt, wie viele Zeichen eine Zeile des Log maximal auflistet. Neuerdings dürfen es mehr als 1024 Stück sein.

Die globale Einstellung »log_buffering« knipst ein Logging ohne zusätzliche Zwischenspeicherung an. Das Verfahren gilt noch als experimentell. Schließlich schaltet der Entwickler über die neue Pool-Einstellung »decorate_workers_output« die Ausgabedekoration der Worker-Ausgaben ein und aus, wenn »catch_workers_output« aktiviert ist.

Rausschmiss auf Raten

Abschließend haben die PHP-Entwickler einige Features, Funktionen und Syntax-Elemente als veraltet (deprecated) gekennzeichnet. PHP-Programme sollten sie nicht mehr verwenden, da sie in künftigen Versionen verschwinden.

Dazu gehört eine Deklaration von Konstanten, die nicht zwischen Groß- und Kleinschreibung unterscheidet (Case Insensitve). »PI« und »Pi« betrachtet PHP 7.3 als verschiedene Konstanten. Wer »define()« im dritten Parameter »TRUE« mit auf den Weg gibt und somit versucht eine Case-Insensitive-Konstante anzulegen, erhält jetzt eine Warnung.

PHP bietet gleich mehrere Funktionen, die eine Zeichenkette in einem Text suchen. Diese nehmen den zu suchenden Text in einem Needle genannten Parameter entgegen. Dieser muss ab sofort zwingend aus einem String bestehen. Die PHP-Entwickler empfehlen, die Needle im Zweifel in einen String zu casten oder explizit die Funktion »chr()« zu bemühen. Betroffen sind die Funktionen »strpos()«, »strrpos()«, »stripos()«, »strripos()«, »strstr()«, »strchr()«, »strrchr()« und »stristr()«.

Entwickler dürfen »assert()« ab PHP 7.3 nicht mehr innerhalb eines Namespace deklarieren. Ebenfalls als veraltet gelten die Funktionen »fgetss()« und »gzgetss()«, die Methode »SplFileObject::fgetss()« sowie der Streamfilter »string.strip_tags«. Verzichten müssen PHP-Programmierer künftig auch auf die Konstanten »FILTER _FLAG_SCHEME_REQUIRED« und »FILTER_FLAG_HOST_REQUIRED«. Beide umfasst jedoch das weiterhin verfügbare »FILTER_VALIDATE_URL«.

Aussortiert hat das PHP-Team »image2wbmp()« sowie alle undokumentierten Funktionen, die mit »mbereg_« beginnen. Statt der letztgenannten sollten PHP-Programmierer die »mb_ereg_«-Funktionen verwenden. Beim Zugriff auf ODBC- und DB2-Datenbanken via PDO_ODBC ist die Einstellung »pdo_odbc.db2_instance_name« Geschichte.

Ausgelaufen

Zum Jahreswechsel 2018 endete der Support für PHP 5.6 und 7.0, die Entwickler stopfen in diesen Versionen keine Sicherheitslücken mehr. Nach mehreren Statistiken treiben die alten Versionen aber immer noch viele Websites an. So laufen fast zwei Drittel aller Joomla-Installationen noch unter PHP 5.6 oder einer früheren Version ([2], Abbildung 1).

Abbildung 1: Anfang Januar liefen noch knapp 36 Prozent aller Joomla-Installationen unter PHP 5.6. Eine grobe Sch&auml;tzung, weil nicht alle Joomla-Seitenbetreiber diese Daten an die Entwickler schicken.

Abbildung 1: Anfang Januar liefen noch knapp 36 Prozent aller Joomla-Installationen unter PHP 5.6. Eine grobe Schätzung, weil nicht alle Joomla-Seitenbetreiber diese Daten an die Entwickler schicken.

Ähnlich besorgniserregende Zahlen meldet auch Metasploit-Anbieter Rapid7: Im Rahmen seines Projekts Sonar scannt er regelmäßig das Internet und sammelt Informationen über die verwendete Software. Die so gewonnenen Statistiken zeigten im Dezember 2018 noch rund 3 Millionen Seiten unter einer veralteten PHP-Version [3].

Abbildung 2: Laut Zeitleiste auf der PHP-Website ist die Zeit f&uuml;r PHP 5.5, 5.6 und 7.0 bereits abgelaufen.

Abbildung 2: Laut Zeitleiste auf der PHP-Website ist die Zeit für PHP 5.5, 5.6 und 7.0 bereits abgelaufen.

Wer noch eine Altversion betreibt, sollte möglichst auf das aktuelle PHP umsteigen. Denn auch die Tage von PHP 7.1 sind gezählt: Derzeit versorgen die Entwickler die bereits Ende 2016 erschienene Version nur noch mit Sicherheitsupdates, am 1. Dezember 2019 ist auch damit Schluss (Abbildung 2). Aktiv unterstützt das PHP-Team seit dem 1. Januar nur PHP 7.2 und 7.3, wobei das erste ab dem 30. November 2019 nur noch ein Jahr Sicherheitspatches erhält [4].

Fazit

Wer ein neues PHP-Projekt in Angriff nimmt, wählt am besten Version 7.3, die nützliche Neuerungen mitbringt. Die sind zwar überschaubar, können aber bestehende Software aus dem Tritt bringen. Seitenbetreiber und Webentwickler sollten daher ihre vorhandenen Skripte anpassen. Das gilt erst recht, wenn noch PHP 5.6 oder 7.0 zum Einsatz kommen. Das PHP-Team hat für Programmierer eine Migrationsanleitung auf seinen Seiten veröffentlicht, die noch einmal die Unterschiede zwischen den Versionen 7.2 und 7.3 erläutert [5].

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 3 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben