XML-Code in PHP-Skripten verwenden mit XHP

© koi88, 123RF

Eng verzahnt

Die von Facebook entwickelte PHP-Erweiterung XHP erlaubt es, HTML- und XML-Tags direkt im PHP-Code zu nutzen. Auf diese Weise erleichtert sie Programmierern von Web-Anwendungen zahlreiche Routinearbeiten und erhöht die Lesbarkeit des Codes.
Mit Hardware-Beschleunigung und schnellem Netz hilft Desktop-Virtualisierung, Administrationsaufwand und Kosten sparen, ADMIN 04/2013 verrät, wie die ... (mehr)

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

 

Abbildung 1: XHP erzeugt hier einen einfachen HTML-Link.
Abbildung 2: XHP ersetzt das x:doctype-Element durch eine HTML5-Dokumenttypdefinition (siehe Listing 3).

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

Abbildung 3: Wenn die Erweiterung korrekt funktioniert und in der php.ini für den Kommandozeileninterpreter angemeldet ist, sollte diese Ausgabe erscheinen.
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« .

Stolperfallen

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>;

Zeichenflucht

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 »&lt;« . 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()

 

Abbildung 4: Die eingegebenen HTML-Tags landen als Text in der Ausgabe (siehe Listing 4).
Abbildung 5: appendChild() hat hier weitere li-Elemente erzeugt (siehe Listing 5).
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