XHP geht unter der Haube äußerst trickreich zu Werke. So gibt es nicht etwa einfach stur alle Tags hinter dem
»echo
«
aus, sondern erstellt für jedes XML- beziehungsweise HTML-Element ein eigenes PHP-Objekt. Beispielsweise liegt nach der Anweisung
$liste = <ul />;
in
»$liste
«
nicht etwa der String
»<ul />
«
, sondern ein Objekt, das diese HTML-Liste repräsentiert. Alle auf diese Weise von XHP erzeugten Objekte besitzen automatisch die Methode
»appendChild()
«
, mit der sich schnell weitere Kindelementeanheften lassen. Ein praktisches Beispiel zeigt
Listing 5
. Es erstellt zunächst eine leere, nicht nummerierte Liste
»<ul />
«
. Anschließend durchläuft es die Elemente des Arrays
»$zahlen
«
und erzeugt für jeden Wert einen neuen Listeneintrag
»<li> ... </li>
«
. Das Ergebnis zeigt
Abbildung 5
. Sie beweist gleichzeitig, dass XHP sämtlichen Whitespace, also Leerzeichen und Tabulatoren, zwischen den einzelnen Elementen ignoriert. Aus:
<p>Hallo Welt</p>
macht XHP daher
»HalloWelt
«
.
Zusätzlich zu den vorgegebenen HTML-Elementen darf der Anwender auch eigene definieren. Das ist zum einen für die Verarbeitung von XML notwendig, zum anderen spart es viel Zeit, einfach nur ein Tag wie
»<zutaten />
«
hinschreiben zu müssen, das XHP dann automatisch gegen eine HTML-Liste mit Zutaten ersetzt. Auf diese Weise lässt sich schnell eine Template-Engine auf die Beine stellen.
Um ein eigenes Element nutzen zu können, müssen Sie lediglich eine neue Klasse erstellen, die allerdings ein paar Bedingungen unterliegt. Zunächst muss sie von der Oberklasse
»:x:element
«
abgeleitet sein, die unter anderem die bereits vorgestellte Funktion
»appendChild()
«
zur Verfügung stellt. Auch muss der Klassenname den Namen des Tags tragen und mit einem Doppelpunkt beginnen. Abschließend müssen Sie noch die Funktion
»render()
«
implementieren, die wiederum XHP-Objekte zurückliefert.
Listing 6
zeigt dazu ein kleines Beispiel. Es erstellt ein neues Element namens
»zutaten
«
. Dies geschieht, indem
Listing 6
zunächst eine passende Klasse
»:zutaten
«
definiert. Damit lernt XHP das Tag
»<zutaten />
«
kennen. Sobald es irgendwo im PHP-Code auftaucht, erstellt XHP das entsprechende Objekt. Genau das passiert in
Listing 6
in Zeile 7. Sobald
»echo
«
das Element ausgibt, ruft XHP automatisch die
»render()
«
-Methode auf, die in diesem Fall eine kleine Liste ausgibt. Genau dort arbeitet
Listing 6
mit einem kleinen Kniff: Die von
»render()
«
zurückgegebene Liste
»<ul> ... </ul>
«
verwandelt XHP automatisch in ein XHP-Objekt,
»render()
«
liefert also auch hier wie gefordert ein XHP-Objekt zurück. Die Rückgabe des Strings
»Ein Artikel
«
würde hingegen zu einem Fehler führen.
Listing 6
Beispiel für eine Klassendefinition
Listing 6
deklariert die Klasse
»:zutaten
«
. Offenbar mit Blick auf XML-Namespaces gilt bei XHP-Klassen jedoch die Konvention, dass man noch ein Präfix verwendet, das ein Doppelpunkt vom eigentlichen Namen trennt. Im Beispiel könnte man das Präfix
»admin
«
wählen, sodass die komplette Klasse
»:admin:zutaten
«
heißt und das Tag somit
»<admin:zutaten />
«
. Dies ist jedoch nur eine Konvention, das Präfix (beziehungsweise den Namespace) kann man in eigenen Projekten auch weglassen.