Mit Hardware-Beschleunigung und schnellem Netz hilft Desktop-Virtualisierung, Administrationsaufwand und Kosten sparen, ADMIN 04/2013 verrät, wie die ... (mehr)

Objektiver Anhang

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« .

Klassisch

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

 

Abbildung 6: Das Element zutaten liefert automatisch die enthaltene Liste (siehe Listing 6).

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.

comments powered by Disqus

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Google+

Ausgabe /2019