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()