Die Entwicklung von PHP 5.4 im Überblick

Sprachen  –  18 Kommentare

Mit der Veröffentlichung von PHP 5.4.0 ist nach zweieinhalb Jahren ein weitreichendes Update für die verbreitete Skriptsprache erschienen. Obwohl die Versionsnummer nur marginal angepasst wurde, flossen viele Funktionen aus dem ursprünglich geplanten Major-Release mit in die Entwicklung ein.

Ursprünglich wollte man nach PHP 5.3 an der Entwicklung von PHP 6 arbeiten. Aufgrund technischer Schwierigkeiten und einer kaum wartbaren Codebasis verwarf man unter anderem den geplanten Support für Unicode-Strings und entschied sich zunächst für die Weiterführung der Reihe 5.x, und gegen eine neue Major-Version. Immerhin: Ein Großteil der für PHP 6 vorgesehen Features floss in PHP 5.4 mit ein.

Die jetzt vorgestellte Version fühlt sich an vielen Stellen folglich wie eine neue Hauptversion an. Sprachfunktionen, von deren Verwendung seit Jahren abgeraten wird, hat das PHP-Team entfernt. Neben dem als fragwürdiges Sicherheitsfeature verrufenem Safe Mode setzen die Entwickler endlich einen Schlussstrich unter Register Globals und Magic Quotes, die man gemeinhin als Quelle für potentielle Sicherheitsprobleme in PHP-Applikationen betrachtet. Mit dem Schritt zwingt man PHP-Entwickler, sich zunehmend selbst um die Sicherheit ihrer Applikationen zu kümmern und sich nicht auf anfällige Sicherheitsmechanismen zu verlassen. Eine Reihe von Initialisierungsoptionen fiel ebenfalls dem Rotstift zum Opfer. allow_call_time_pass_reference und y2k_compliance stehen nicht mehr zur Verfügung, mit dem Ziel, weniger Konfigurationsoptionen für das Verhalten der Sprache anzubieten, um damit die Portabilität zu erhöhen.

Entscheidender ist jedoch die Änderung an der Ini-Option default_charset. Gibt der Entwickler keine eigene Voreinstellung an, setzt PHP das Charset im Content-type Header nun standardmäßig auf UTF-8. Das ist sinnvoll und ebenfalls längst überfällig. Leider geht diese wichtige Änderung in Anbetracht der neuen Sprachfeatures häufig unter. Dabei ist zu erwarten, dass die Änderung auf schlecht konfigurierten Hosts zu Problemen führt – falls die Applikation nicht UTF-8 ausgibt und der Browser aufgrund des Content-Typs UTF-8 erwartet.

Kritik gibt es auf der Developer-Mailingliste für die Entscheidung, das Error Reporting Level E_STRICT bei der Angabe von E_ALL ebenfalls zu aktivieren. Viele PHP-Konfigurationen setzen das Error Reporting standardmäßig auf den Wert E_ALL. Verletzt die Anwendung einen Strict-Standard, wird nun ein Fehler angezeigt. Dadurch werden im schlimmsten Falle jedoch ungewollt Details zum Quelltext öffentlich, und man handelt sich ein Sicherheitsproblem ein, bestenfalls wirkt das nur peinlich. Zurücknehmen wird man die Entscheidung allerdings nicht, denn seit Jahren schon gilt die Empfehlung, Projekte auf Strict-Standard zu testen und sicherzustellen, dass der Quelltext frei von als "deprecated" markierten Features ist.

PHP 5.4 bringt viel Neues. Eine Reihe zusätzlicher Sprachelemente soll den Programmierern helfen, Anforderungen moderner Webanwendungen effektiver zu implementieren und die Sprache konsistenter zu machen.

Die größte Neuerung in PHP 5.4 sind Traits. Das aus Scala bekannte Konzept wurden schon 2007 von Stefan Marr vorgeschlagen und nach mehreren Anläufen und Verbesserungen schließlich in die neue Version übernommen. Traits erlauben es dem Entwickler, mehrere Sammlungen von Methoden in einer Klasse zu mischen und ermöglichen so die horizontale Wiederverwendung von Komponenten. Man erhofft sich, Anwendungen mit Traits kompakter gestalten zu können und Klassenhierarchien zu vereinfachen. Programmteile sollen zudem besser wiederverwendbar sein.

Ein Beispiel:

  <?php
trait Jsonify {
public function toJson() {
$res = [];
foreach ($this as $prop => $val) {
$res[$prop] = $val;
}
return json_encode($res);
}
}

class User {
public $id = 1;
public $username = 'test';
use Jsonify;
}

echo (new User)->toJson();

Im Gegensatz zum ganz ähnlichen Ansatz über Mix-ins können Klassen beim Verwenden von Traits Präferenzen oder Aliase angegeben, um mögliche Konflikte in Methodennamen aufzulösen:

  <?php
trait Serialization {
public function toJson() {
return null;
}
}

trait Jsonify {
public function toJson() {
$res = [];
foreach ($this as $prop => $val) {
$res[$prop] = $val;
}
return json_encode($res);
}
}

class User {
public $id = 1;
public $username = 'test';
use Jsonify, Serialization {
Jsonify::toJson insteadof Serialization;
}
}

echo (new User)->toJson();

Traits unterliegen einigen Einschränkungen. Sie können keine Interfaces direkt implementieren und die Definition von Properties ist nur eingeschränkt erlaubt. Eine ausführliche Dokumentation findet sich im PHP Manual.