10.2 PHP_CompatInfo 

Besprochene Version: 1.0.0RC3 | Lizenz: PHP-Lizenz 2.02 |
Klassendatei(en): PHP/CompatInfo.php; PHP/CompatInfo/Cli.php |
Den Paketen PHP_CompatInfo und PHP_Compat liegt eine sehr schöne Idee zu Grunde. Diese Pakete versuchen, Problemen vorzubeugen, die auftreten können, wenn PHP-Scripts nicht kompatibel mit der PHP-Version sind, die auf einem Server genutzt wird.
PHP_CompatInfo ist hierbei in der Lage, ein Script zu analysieren und festzustellen, welche PHP-Version benötigt wird, um das Script auszuführen.
Das Paket kann Daten aus einem String, einer Datei oder aus mehreren Dateien (sprich einem Unterverzeichnis) analysieren.
<?php require_once ('PHP/CompatInfo.php'); // Neues Objekt ableiten $info = new PHP_CompatInfo; // Dateinamen setzen $datei = 'quelle.php'; // Datei einlesen und analysieren $erg = $info->parseFile($datei); ?>
Listing 10.2 Analyse einer Datei
Die in Listing 10.2 ermittelten Daten werden in $erg in Form eines Arrays abgelegt. Der Aufbau könnte beispielsweise so aussehen:
array(3) { ["version"]=> string(5) "4.0.0" ["extensions"]=> array(5) { [0]=> string(5) "mysql" [1]=> string(5) "mysql" [2]=> string(3) "pdf" [3]=> string(5) "mysql" [4]=> string(5) "mysql" } ["constants"]=> array(1) { [0]=> string(8) "__FILE__" } }
Der Schlüssel version verweist auf die PHP-Version, die mindestens erforderlich ist, um den Code auszuführen. Der Schlüssel extensions verweist auf ein Array, das Informationen darüber enthält, welche Erweiterungen verfügbar sein müssen, damit der Code ausgeführt werden kann. In diesem Fall taucht mysql mehrfach auf, weil mehrere mysql-Befehle in der analysierten Datei zu finden sind. Bei längeren Programmen ist es an dieser Stelle sicher sinnvoll, das Array mit array_unique() zu bearbeiten, um doppelte Einträge zu verhindern.
Der letzte Schlüssel, constants, enthält ein indiziertes Array, in dem alle System-Konstanten aufgelistet sind, die das Script nutzt.
Möchten Sie keine Datei, sondern einen String parsen, steht parseString() zur Verfügung. Der Methode können Sie als zweiten Parameter ein Array übergeben, das den Schlüssel 'ignore_functions' unterstützt. Dieser kann auf ein indiziertes Array mit Funktionsnamen verweisen, die bei der Analyse ignoriert werden sollen.
Um mehrere Strings oder Arrays auf einmal zu durchforsten, ist die Methode parseArray() deklariert, die ein Array mit den Dateinamen bzw. Strings übergeben bekommt. Handelt es sich um ein Array, das aus Strings besteht, müssen Sie als zweiten Parameter noch ein Array übergeben. Dieses Array muss den Schlüssel 'is_string' enthalten, der true enthalten muss. Darüber hinaus wird auch 'ignore_functions' unterstützt.
Die letzte Möglichkeit, Dateien zu analysieren, ist parseDir(). Sie bekommt den Pfad eines Verzeichnisses übergeben, in dem alle Dateien betrachtet werden. Auch diese Methode kann einen zweiten Parameter in Form eines Arrays verarbeiten. Dieses Array unterstützt neben 'ignore_functions' auch die Schlüssel 'file_ext', 'recurse_dir', 'ignore_files' und 'ignore_dirs'. Mit dem ersten können Sie ein Array mit Dateinamenserweiterungen übergeben, um die zu erfassenden Dateien festzulegen. In der Standardeinstellung werden Dateien mit den Endungen .php, .php4, .inc und .phtml erfasst. Übergeben Sie mit 'recurse_dir' ein false, werden untergeordnete Verzeichnisse nicht durchsucht, was standardmäßig gemacht wird. Die letzten beiden Schlüssel können jeweils auf ein Array verweisen, in dem Sie die Namen von Dateien bzw. Verzeichnissen übergeben können, die ignoriert werden sollen.
Diese Methode liefert, genau wie parseArray(), ein etwas umfangreicheres Array zurück. Hier ist der Anfang des Arrays so aufgebaut, wie oben beschrieben wurde. In diesem ersten Teil wird der kleinste gemeinsame Nenner beschrieben, den alle Dateien benötigen. Danach folgt für jede Datei noch ein zusätzlicher Eintrag, in dem sich ein verschachteltes Array befindet, in dem die Spezifikationen für diese einzelne Datei enthalten sind.
Die beschriebenen Methoden sind auch noch mal in der Klasse PHP_CompatInfo_Cli enthalten, die in der Datei PHP/CompatInfo/Cli.php definiert ist. Der Sinn dieser Klasse ist es, ein möglichst einfaches Interface für den Einsatz der Klasse auf der Kommandozeile bereitzustellen. Zum einen stehen hier die schon beschriebenen Methoden zur Verfügung. Darüber hinaus verarbeitet der Konstruktor aber auch direkt Kommandozeilenoptionen. Ein solches Script kann aussehen wie in Listing 10.3.
#!/usr/bin/php <?php require_once 'PHP/CompatInfo/Cli.php'; $info = new PHP_CompatInfo_Cli; $info->run() ?>
Listing 10.3 Analyse eines Scripts über die Kommandozeile
Der Name der zu analysierenden Datei kann mit --file=dateiname oder -f übergeben werden. Mit --dir=Verzeichnis oder -d können Sie ein Verzeichnis spezifizieren, das die gewünschten Dateien enthält, und mit --recurse bzw. -n können Sie verhindern, dass darunter liegende Verzeichnisse durchsucht werden. Die Methode run(), die hier genutzt wurde, generiert direkt eine Bildschirmausgabe.