PHP 5.3 Neuerungen

2010-02-13 - kostaki

Auf PHP 5.3 warten wir ja nun schon eine Weile. Bisher hatte ich noch nicht die Zeit oder Lust mich mit dem Thema zu beschäftigen, aber vor ein paar Tagen viel mit das Buch von Stefan Prisch - PHP 5.3 Die Neuerungen in die Hände. Da es äußerst handlich (A6-Format) ist, hat man es schnell durch gearbeitet und damit wenigstens einen Überblick über die neuen Features der nächsten Major PHP Version. Interessant fand ich das PHP 5.3 ja eigentlich PHP 6 werden sollte, aber als die Implementierung der Unicode Unterstützung nun doch zu aufwändig wurde, hat man diesen Punkt weg gelassen und so wurde aus PHP 6 PHP 5.3. Hier eine kurze Zusammenfassung der Features/Anpassungen die mich Interessierten.

E_DEPRECATED Fehler und Referenzübergabe zur Laufzeit

Es gibt eine neue Fehler Klasse E_DEPRECATED, die wie E_SCRIPT nicht zum Scriptabbruch führt, die man aber trotzdem nicht ignorieren sollte. Funktionen die in späteren Versionen nicht mehr unterstützt werden, werfen diesen Fehler, damit man sie schon heute ersetzen kann. Ein gutes Beispiel sind die ereg Funktionen, die sich bald verabschieden werden. Ein weiterer Fall ist die Referenz Übergabe zur Laufzeit. Dieses Feature von PHP setze ich selbst auch sehr oft ein und so haben mich die auftretenden Fehler doch etwas schockiert, aber immerhin ist es leicht zu beheben und die Anpassung macht natürlich Sinn! Es geht um das "&" Zeichen beim Funktionsaufruf (nicht Deklaration). Damit konnte man Parameter, auch wenn sie nicht als Referenz in einer Funktion definiert wurde, als solche übergeben. Die Funktion kann dies natürlich nicht wissen und behandelt die Variable als lokal, was zu seltsamen Ergebnissen führen kann. Hier ein Beispiel das einen E_DEPRECATED Fehler erzeugt.

function foo($bar)
{
	$bar++;
	echo $bar;
}
$a = 1;
foo(&$a);
echo $a;

Bei der Definition von foo wurde der Parameter $bar nicht als Referenz angegeben. Beim Aufruf wurde er aber als Referenz übergeben. Richtig wäre es wenn man den Parameter direkt bei der Funktionsdefinierung als Referenz markiert.

function foo(&$bar)
{
	$bar++;
	echo $bar;
}
$a = 1;
foo($a);
echo $a;

Neue Funktionen

Interessant fand ich die neue Funktion array_replace(), die arrays zusammenführen soll. Den Unterschied zu array_merge() stellt man erst fest wenn man numerische Array Keys benutzt. Bei array_merge() werden diese nämlich nicht ersetzt, sondern angefügt und im Anschluss wird das array neu indexiert. Bei array_replace() gibt es keine neu Indexierung und die Werte werden aus den Arrays werden zusammen gefasst. Benutzt man assoziierte Keys, stellt man keinen Unterschied beider Funktionen fest, weshalb ich das Beispiel im Buch als vollkommen überflüssig ansehe. Für das Rekursive zusammenfügen von arrays nach dem gleichen Schema gibt es nun array_replace_recursive(). Die weiteren neuen Funktionen werden hier beschrieben.

Neue Konstante __DIR__

Das Konstrukt dirname(__FILE__) benutze ich sehr oft für path Definierungen und dann für Includes. Das gleiche macht nun die neue Konstante __DIR__, die den Pfad des Verzeichnisses der aktuellen Datei beinhaltet. Das man Dateien mit absoluten Pfaden included habe ich von mir aus schon immer gemacht, aber im Buch steht ein Grund der mir vorher nicht wirklich bewusst war. Included man mit relativen Pfaden, überprüft PHP alle im include_dir angegebenen Verzeichnisse und das sind natürlich mehrere Festplatten Zugriffe.

//vorher
require_once(dirname(__FILE__) . '/include.php');

//jetzt
require_once(__DIR__ . '/include.php');

Lambda Funktionen

Ein weiteres sehr cooles Feature sind die neuen Lambda Funktionen die ich schon in Javascript lieben gelernt habe. So ist dies hier jetzt möglich:

$foo = function($bar)
{
	echo $bar;
};
$foo('Hallo Welt');

Das Semikolon nach der geschweiften Klammer ist im übrigen kein Fehler.

Namespaces

Das einführen von Namespaces war lang überfällig. Mir gingen schon langsam die Tags aus um Klassen und Funktionsnamen eindeutig zu machen, aber das ist jetzt nicht mehr nötig. Mit Namespaces kann man seine Klassen nennen wie man möchte ohne Rücksicht auf Kollisionen nehmen zu müssen. Eine Klasse namens Exception ist aktuell noch nicht möglich, aber bald schon. Eine Erklärung von Namespaces würde hier den Rahmen sprengen, aber dieses neue Feature sollte sich jeder mal genauer ansehen.

SQLite3 wird Standard

In PHP 5.3 wird SQLite3 der Standard werden. SQLite ist eine Datenbank die keinen eigenständigen Server benötigt, auf so gut wie jeder Plattform läuft und dafür äußerst performant ist. Aktuell kann man auch schon auf SQLite3 Datenbanken zugreifen, aber man muss dafür die PDO benutzen. Durch die 64Bit Unterstützung in SQLite3 sind größere Datenbanken möglich und durch das verbesserte Locking wird der Zugriff von vielen gleichzeitigen Verbindungen verbessert. Wichtig ist das man nicht per SQLite3 auf alte Version 2 Datenbanken zugreifen kann. Man muss die Datenbank neu erzeugen und dann füllen.

PHP Garbage Collector

Der Garbage Collector von PHP wurde auch überarbeitet/eingebaut?. Bei lang laufenden Scripten merke ich es recht oft das der Speicher nicht freigegeben wird, auch wenn ich die Variablen/Objekte zerstöre. Vielleicht funktioniert es ja in 5.3 wie gewünscht.

Fazit

PHP 5.3 hält einige sehr coole neue Features für uns bereit, die die Arbeit mit PHP vereinfachen wird. Außerdem werden unsinnige "Features" endlich entfernt oder angepasst, was PHP helfen wird als wirkliche Programmiersprache angesehen zu werden und nicht nur als Scriptkiddie Choice of the Day. Was das Buch angeht muss ich leider sagen das die Investition sich nicht lohnt. Das liegt nicht direkt an dem Buch selbst, sondern an dem sehr guten PHP Manual: Migration from 5.2 -> 5.3. Wer einen Überblick über die Änderungen von PHP 5.3 haben möchte, ist dort gut aufgehoben und kann sich die 12,90€ sparen.

No related posts.

One Response to “PHP 5.3 Neuerungen”

Leave a Reply