PHP

Objektorientierte Konfigurationsverwaltung in PHP (PHP Tutorial)

Tutorial erstellt von TakaBo, letzte Änderung am 04.07.2007

Mir fällt immer wieder auf, dass viele PHP-Programmierer die objektorientierten Features von PHP5.x verschmähen, obwohl das OO-Paradigma einige Vorteile bringt:


  • Reuseability von Code

  • der Code kann übersichtlicher werden

  • die Codequalität steigt

  • Benutzung von Entwurfsmuster fördern zusätzlich die Reusability und die Qualität der Software



Aus diesem Grund habe ich mich entschieden ein kleines Tutorial zu schreiben. Es soll für den Anfang gezeigt werden, mit welch einfachen Mitteln die Umsetzung einer Konfigurations-Klasse möglich ist und welche Vorteile dies mit sich bringt.

Zuerst überlegen wir uns, wie die Konfiguration auf dem Datenträger abgelegt werden soll. XML ist zwar der Hype schlecht hin, aber nicht zu empfehlen, wenn man seine Konfigurationen auch mal kurz mit dem Texteditor verändern möchte. Das Ini-Format wäre doch schon besser geeignet. Jede Datei ist in Abschnitte, sogenannte Sections eingeteilt. Man kann sie benutzen, um Konfigurationsparameter logisch von ihrer Anwendung zu trennen. Jede Section enthält entsprechende Parameter. Ein Beispiel könnte so aussehen:

Code:
[DATENBANK]
dbid=pgsql
dbname=test
dbuser=postgres
dbpass=sonstwas

[KLASSEN]
classpath=/usr/local/www/data/classes

usw.


Wie der Zufall es will, stellt PHP seit der Version 4 sogar einen Parser dafür zur Verfügung.
Seine Signatur sieht wie folgt aus

Code:
array parse_ini_file ( string filename [, bool process_sections] )


filename = Ist der Pfad und Name der Inidatei ( z.B. „/usr/local/www/data/config.ini“)
process_sections = true oder false. Gibt an, ob die Sections auch bearbeitet werden sollen.

Nun ist es natürlich Blödsinn, jedes mal die Datei neu zu parsen, um an die Daten zu kommen. Festplatte und unnötige redundante Verarbeitungen bremsen unsere Software nur unnötig aus. Wir müssen also die Daten einmal bearbeiten und sie dann für spätere Verarbeitungen vorrätig halten. In der Praxis hat sich das sogenannte Singleton für diese Aufgabe bewährt. Das Singleton ist ein so genanntes Entwurfsmuster. (Mehr zu dem Thema Entwurfsmuster: Erich Gamma et.al -Entwurfsmuster, Addison Wesley, ISBN: 3827321999  )

Doch wie wirkt ein Singleton? Das Singleton stellt eine statische Funktion zur Verfügung, mit dem genau ein Objekt der Klasse erstellt wird. Selbst nach mehrfachen Aufrufen dieser Funktion erhält man immer wieder eine  Referenz auf das gleiche Objekt.

Code:
//Dateiname: config.php
class config{

static $instance;

static function getInstance()
{
if (!isset(self::$instance))
{
self::$instance = new config();
}
return self::$instance;
}

protected function __construct()
{
}
}


So sieht das Grundgerüst unserer config-Klasse aus. Es kann noch nicht viel, außer eine Instanz seiner selbst erzeugen über die Methode ::getInstance(). Etwas viel zu schreiben mag man meinen, aber das täuscht. Diese Klasse kann auch in anderen Projekten wieder verwendet werden, was Zeit spart.

Dazu bedarf es nur einem

Code:
require_once 'config.php';


im Kopf der Datei, in der man die config-Klasse benutzen möchte. Ich persönlich habe mir angewöhnt die Datei nach der Klasse zu benennen, also config.php für die config-Klasse.

Unsere Klasse macht noch nicht viel, deshalb erweitere ich den Konstruktor und füge noch eine Methode hinzu:

Code:
protected function __construct()
{
$this->cfg=parse_ini_file(dirname(__FILE__)."/system.ini", TRUE);
// In diesem Fall muß die system.ini im gleichen Verzeichnis liegen, wie die config-Klasse.
}

function getCfg( $section )
{
return $this->cfg[$section];
}


Nun stellen wir uns eine typische Situation vor. Wir wollen eine Datenbank öffnen.

Code:
<?php
require_once 'config.php';

$dbcfg = config::getInstance()->getCfg('DATENBANK');
try {
$db= new PDO( $dbcfg['dbid'].“:host=localhost;dbname=“.$dbcfg['dbname'], $dbcfg['dbuser'], $dbcfg['dbpass'] );
}
catch  (PDOException $e)
{
echo „Datenbankfehler:“.$e->getMessage();
}

?>



Auf diese Weise hat man alle Konfigurationsdaten in einer INI-Datei, was das Erstellen von Installskripten vereinfacht und man kann überall einfach darauf zugreifen. Eine Änderung der Konfiguration ist einfach möglich, ohne direkt in den Code eingreifen zu müssen.

Viel Spaß beim rumprobieren,

Chris

Wie kann man die OO-Eigenschaften von PHP 5.x dazu nutzen, um sich Arbeit zu sparen.


>> Allgemeine Fragen oder Probleme mit dem Tutorial? Hier gehts zum Forum!

Impressum / Datenschutzerklärung          © der-Webdesigner.net 2002 - 2011           top ▲