am 12. Juni 2009
Als erstes möchte ich mal bei Nils bedanken das er dieses tolle Projekt ins Leben gerufen hat! Und als zweites möchte ich mich kurz vorstellen. Ich bin Manuel Grundner, ich komme aus dem Herzen der Steiermark, genauer gesagt aus Graz, und bin seit längerer Zeit Freier Mitarbeiter beziehungsweise Selbstständiger auf dem Websektor mit Schwerpunkt auf PHP-Entwicklung.
So aber genug um den heißen Brei herum geredet, ich werde versuchen euch die neuen Sprachfeatures von PHP5.3 vorallem in Verbindung mit Patterns etwas näher zu bringen. Für die, die es noch nicht wissen, PHP5.3 ist bereits mit RC2 am Start, und viele (vor allem ich) warten schon gierig auf die neuen Features:
- Namespaces - Welch ein Segen für jeden Framework-Entwickler
- Late Static Binding - Ein tolles Feature, das ich auch schon lange vermisst habe
- Type-Hinting - self, parent, interfaces; könnte zwar schwören das die Interfaces in 5.2 schon gingen, aber je mehr Type-Hinting desto besser!
- Closures & Lambda – Ein bisschen prozedural darfs sein…
- GOTO - Ein Feature dem ich weniger positiv gegenüber stehe… es hat jedoch sicher irgendwo seine Berechtigung
- NOWDOC – Late Static Binding für die HEREDOC-Syntax
- __invoke – Benutz mich! Wie das schon wieder klingt…
Objekte als Funktionen
- __callStatic – __call im statischen Kontext
- Rundungsverhalten - Kam einen auch schon öfter in die Quere…
- __DIR__ – Wo bin ich? oder dirname(__FILE__) mal anders
- Und noch einiges mehr, für weitere Schmökereien: das Scratchpad (http://wiki.php.net/doc/scratchpad/upgrade/53)
- Und für die die Undokumentiertes lieben (http://wiki.php.net/doc/todo/undocumented)
Da hat sich ja einiges getan! Ich bin so aufgeregt, ich weiß gar nicht wo ich anfangen soll! Ach was, machen wirs wie ein Interpreter, schön brav von oben nach unten!
Namespaces sind wirklich ein Feature, bei dem sich die Community wahrhaftig die Seele aus dem Leib gebrüllt hat. Viele andere Sprachen machten es vor, oder hatten es bereits von Anfang an Bord, PHP brauchte eben noch etwas Zeit.
Aber Namespaces? Kann man das essen? Naja essen nicht gerade, aber man kann den Küchenjungen vorm Gast “verstecken” oder so ähnlich.
Um aus dem Wiki zu zitieren:
Ein Namensraum ist ein deklaratorischer Bereich, der einen zusätzlichen Bezeichner an jeden Namen anheftet, der darin deklariert wurde. Dieser zusätzliche Bezeichner macht es weniger wahrscheinlich, dass ein Namenskonflikt auftritt mit Namen, die anderswo im Programm deklariert wurden. Es ist möglich, den gleichen Namen in unterschiedlichen Namensräumen ohne Konflikt zu verwenden, auch wenn der gleiche Name in der gleichen Übersetzungseinheit vorkommt. Solange er in unterschiedlichen Namensräumen erscheint, ist jeder Name eindeutig aufgrund des zugefügten Namensraumbezeichners.
Oke was bedeutet das jetz aber genau, und vorallem im Bezug auf PHP?
Fangen wir mal mit der Syntax an:
<?php
namespace PHPHatesMe;
function sometimesSure()
{
return 'Yeah!';
}
?>
Das Keyword “namespace” leitet die Deklaration eines neuen Namensraums ein. Wenn Namespaces verwendet werden sollen, muss es vor jeder Zeile PHP-Code stehen. Hierbei sei zu beachten das diese Notation nur einen einzigen Namespace pro Datei möglich zulässt.
Aber was bedeutet das jetzt?
Will ich nun die Funktion sometimesSure() aufrufen, kann ich sie nicht mehr ohne weiteres mit sometimesSure() aufrufen, es sei denn diese Funktion liegt im selben Namespace. Der Interpreter präfixed jeden Funktions-, Klassen- oder Methodenname mit dem Namespace in dem er liegt.
Der Aufruf:
PHP hat zwar einen nicht sehr benutzerfreundlichen Trenner (\) für Namespaces gewählt, und Wunsch der Community nach dem :: oder ::: Operator verdrängt, aber hinsichtlich auf Konflikte mit der bestehenden Engine (Statische Variablen, Methoden und Konstanten) und der einfacheren Tippweise auf Englischen Tastaturen sich für den Backslash entschieden.
Möchte ich nun aus einer anderen Datei, oder aus einem anderen Namespace herraus aufrufen muss ich den Präfix voranstellen.
<?php
echo \PHPHatesMe\sometimesSure(); //Yeah!
?>
Liest sich etwas holprig, aber das Leben wird schön, wenn man das “use” Keyword kennt (oder endlich IDE’s mit Namespace-Unterstützung auftauchen)
<?php
use PHPHatesMe;
echo PHPHatesMe\sometimesSure(); //Yeah!
?>
“use” importiert einen Namensraum in einen anderen (in diesem Fall in den globalen). Der Globale Namensraum ist eine wichtige Sache! Spätestens dann wenn man PHP-Interne Klassen oder Konstanten aus einem Namespace-Focus anspricht:
<?php
namespace PHPHatesMe\Really;
use \Exception as BaseException;
class Exception extends BaseException;
{
}
function throwMe()
{
throw new Exception('Who am I?'); //PHPHatesMe\Really\Exception
}
?>
Hier wird auch der Vorteil Namespaces sehr deutlich, endlich Klassen die einen Namen tragen der ihrer Verwendung entspricht! Zugegeben, das Beispiel war nicht gerade das Beste, aber ich denke der Grundgedanke kam durch.
Gleich haben wir ein neues Keyword gelernt “as”. Dieses Keyword in Verbindung mit “use” ermöglicht es dem Entwickler einen Alias für einen Namen zu verwenden und diesen komplett in den Namespace zu integrieren. Dies kann bei Namenskonflikten hilfreich sein, oder bei zu langen Klassennamen Abhilfe schaffen. Hierbei sollte man natürlich beachten, dass die Lesbarkeit und somit die Wartbarkeit von Code reduziert werden kann. Es sei also mit Bedacht gewählt, denn wer aus dem Klassennamen User schlicht und ergreifend U macht, wird sich nach einiger Zeit fragen was U ist, und wer möchte schon ständig in der Namespace-Deklaration nachsehen was U eigentlich bedeutet.
Keine Angst, sollten Namenskonflikte bei der Alias-Zuweisung auftreten meckert PHP und es wird nicht einfach irgendwas aufgerufen.
Ich denke das dies als kleine Einführung in die Welt der PHP-Namespaces fürs erste genügt. Wer Lust darauf bekommen hat kann natürlich in der Online-Dokumentation (http://de.php.net/manual/en/language.namespaces.php) weitere Informationen erhalten. Ich verweise hier bewusst auf die Englische, da das deutsche Dokumentationsteam leider immer etwas nachhinkt.
In meinen (hoffentlich) weiteren Artikeln werde ich immer Gebrauch der neuen Sprachfeatures machen, was das gute Zusammenspiel der Features hervorhebt, jedoch leider auch aufbauendes Wissen auf ältere Artikel fordert. Aber keine Angst, PHP hasst euch nicht immer.