PHP-Skripte
sind im Regelfall kein Selbstzweck, sondern geben meistens HTML-Code aus, den ein Browser schließlich anzeigt. Weil es sich dabei aber nicht um statisches HTML handelt, sondern sich im PHP-Code eine Menge von Variablen wiederfinden, führt das schnell zu so kryptischem PHP-Code wie in
Listing 1
. Es packt den Inhalt der Variablen
»$url
«
in das Attribut
»href
«
des
»<a>
«
-Tags und baut so einen Link auf die Seiten des ADMIN-Magazins. Besonders betroffen von solch einem Zeichensalat sind Entwickler von Template-Systemen, die schon bei einfacheren Vorlagen ihre Variablen vor lauter Klammern nicht mehr sehen.
Listing 1
Einfacher Link in PHP
Besser lesbar ist der Code, wenn man das HTML einfach in das Skript schreibt und dort die PHP-Variable einbettet, so wie in Listing 2 . Genau das ermöglicht XHP. Die PHP-Erweiterung verwandelt XML- und somit auch HTML-Bausteine in gültige PHP-Ausdrücke. Die dadurch entstehende Kurzschreibweise hat den Vorteil, dass Programmierer besser den Durchblick behalten und ihre Fehlerrate sinkt.
Listing 2
Einfacher Link mit XHP
Installation
XHP ist eine Erweiterung für PHP, die es im Quellcode gibt
[1]
. Der Installationsprozess ist zudem auf Linux-Systeme ausgelegt, eine fertige
».dll
«
für Windows gibt es nicht. Offiziell unterstützt XHP die PHP-Versionen 5.2 und 5.3, ließ sich aber auch unter unter Debian 7 mit PHP 5.4 in Betrieb nehmen.
Um XHP auf einem jungfräulichen Ubuntu 13.04 oder Debian 7 zu installieren, spielen Sie zunächst Apache samt PHP 5 mit seinem Entwicklerpaket ein:
sudo apt-get install apache2 php5 php5-dev
Um XHP übersetzen zu können, brauchen Sie zusätzlich noch GCC 4.0 nebst G++ 4.0, Flex ab Version 2.5.35, Bison ab Version 2.3 und Re2c in Version 0.13.5 oder höher:
sudo apt-get install build-essential flex bison re2c
Jetzt laden Sie sich entweder auf Github via ZIP-Knopf den Quellcode herunter
[1]
oder klonen mit
»git
«
das Repository:
git clone git://github.com/facebook/xhp.git
XHP übersetzt dann der folgende Dreischritt:
phpize ./configure make
Per
»make test
«
können Sie das Kompilat jetzt einmal prüfen lassen.
Die Installation im System übernimmt schließlich der Befehl:
sudo make install
Die neue Erweiterung müssen Sie in der
»php.ini
«
aktivieren. Unter Debian und Ubuntu liegt die Konfigurationsdatei im Verzeichnis
»/etc/php5/apache2
«
. In ihr ergänzen Sie die Zeile:
extension=xhp.so
Je nach Installation müssen Sie unter Umständen den kompletten Pfad zur
»xhp.so
«
angeben, den
»sudo make install
«
verraten hat. Nach einem Neustart des Webservers via
»sudo /etc/init.d/apache2 restart
«
sollte
Listing 2
funktionieren. Unter Ubuntu und Debian gehört es in das Verzeichnis
»/var/www
«
, wo man es beispielsweise als
»test.php
«
ablegt. Dort müssen Sie dann auch noch die PHP-Datei aus dem Unterverzeichnis
»php-lib
«
des XHP-Quellcode-Archivs parken, bevor Sie in einem Browser unter
»http://localhost/test.php
«
das Ergebnis betrachten dürfen. Alternativ lässt sich die Einsatzbereitschaft auf der Kommandozeile prüfen (
Abbildung 3
):
php -r 'echo "XHP!\n"; exit; <a />;'
Debian und Ubuntu weisen dem Kommandozeilen-Interpreter von PHP jedoch eine eigene
»php.ini
«
zu, die im Unterverzeichnis
»/etc/php5/cli
«
liegt. Dort müssen Sie ebenfalls XHP eintragen, sonst schlägt der Aufruf fehl.
XHP verarbeitet primär XML-Code. Das bedeutet insbesondere, dass einige lasche HTML-Regeln nicht gelten. So führt:
»echo <img src={$datei}>;
«
zu einem Fehler, weil das Tag nicht korrekt geschlossen ist. Richtig wäre:
»echo <img src={$datei} />;
«
. XHP achtet zudem penibel auf korrekte Start- und End-Tags. Ein
»<h1>Hallo Welt!</h2>
«
führt zu einem Abbruch der Verarbeitung. In der Regel sieht man dann nur eine weiße Seite. Allerdings ergänzt XHP die fehlenden Anführungszeichen in Attributen, in
Listing 2
etwa die von
»href
«
.
Damit
Listing 2
funktioniert, muss man die im XHP-Quellcode-Archiv mitgelieferte Datei
»init.php
«
einbinden, die wiederum ihre Kolleginnen
»core.php
«
und
»html.php
«
nachholt. Folglich ist man auch gezwungen, alle drei Dateien mit der eigenen Web-Anwendung auszuliefern. Die XHP-Erweiterung selbst wertet lediglich die XML-Syntax aus, um alles andere kümmern sich die erwähnten PHP-Dateien. Die Dreierbande findet man entweder im Unterverzeichnis
»php-lib
«
des Quellcode-Archivs oder direkt auf Github
[1]
.
In Listings 2 fehlt absichtlich eine Dokumenttypdefinition. Da XHP eine solche nicht verdauen kann, würde die folgende Zeile zu einem Fehler führen:
echo <!DOCTYPE html>;
Für HTML5-Dokumente gibt es deshalb das Spezial-Element
»x:doctype
«
. Kapselt man den Seiteninhalt zwischen
»<x:doctype>
«
und
»</x:doctype>
«
, ergänzt XHP automatisch die Dokumenttypdefinition
»<!DOCTYPE html>
«
.
Listing 3
gibt dafür ein kleines Beispiel.
Listing 3
HTML5-Doctype
Unbedingt sollte man auf das abschließende Semikolon achten. Das vergisst man bei der Programmierung leicht, insbesondere wenn der HTML-Code wie in Listing 3 über mehrere Zeilen läuft.
Den Inhalt in den geschweiften Klammern
»{}
«
interpretiert XHP als vollständigen PHP-Ausdruck, er darf also nicht nur wie in PHP eine Variable enthalten. Die folgende Zeile gibt deshalb
»2
«
im Browser aus:
echo <p>{1+1}</p>;
In
Listing 4
könnte ein Nutzer auch HTML-Code in das Feld eintippen und diesen so in die Seite einschleusen. XHP entschärft jedoch automatisch XML- und HTML-Code (Escaping) mit passenden Zeichen beziehungsweise Entities. Sollte der Benutzer wie in
Abbildung 4
eine spitze Klammer
»<
«
eingeben, macht XHP daraus die Entität
»<
«
. In reinem PHP würde man dazu die Funktion
»htmlspecialchars()
«
bemühen
[2]
. Tatsächlich ist Zeile 4 in
Listing 4
gleichbedeutend mit:
echo '<p>Ihre Eingabe: '.htmlspecialchars($_POST['eingabe']).'</p>';
Listing 4
Beispiel für Escaping
Listing 5
Anwendung von appendChild()