Autoloading àla Zend Framework

Wer hat sich schonmal gefragt, warum alle Klassen des Zend Frameworks immer so lang sein müssen? Zend_View_Helper_Navigation_Breadcrumbs, Zend_Db_Adapter_Pdo_Mysql oder auch sehr schön ist Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive.
Die Antwort ist ganz einfach: So lässt sich genau nachvollziehen, wo sich die Klasse befindet, denn aus dem Namen lässt sich das genaue Verzeichnis der Klasse ablesen. So liegt die Klasse Zend_View_Helper_Navigation_Breadcrumbs beispielsweise unter Zend/View/Helper/Navigation/Breadcrumbs.php. Dieses Schema bringt nicht nur Struktur in das Klassen-Chaos einer Anwendung, sondern bietet auch eine hervorragende Möglichkeit, die Klassen automatisch zu laden, ohne dass die Klasse jedes mal mit require_once inkludiert werden müssen. Dazu bedienen wir uns einfach der Funktion __autoload, die jedes mal aufgerufen wird, wenn eine Klasse verwendet wurde, die nicht existiert.

function __autoload($className)
{
    $classFile = implode("/", explode("_", $className)).".php";
    require_once(DEIN_ROOT_PFAD.$classFile);
}
$obj = new Zend_Db_Adapter_Pdo_Mysql(); // Lädt automatisch die Datei Zend/Db/Adapter/Pdo/Mysql.php

Natürlich lässt sich das noch weiter ausbauen und mit verschiedenen Include-Paths verwenden.
Wenn ihr also das nächste mal eine neue Anwendung plant, macht es Sinn, dasselbe Namensschema wie das Zend Framework oder PEAR zu nutzen. So müsst ihr euch nicht mehr darum kümmern, ob eine Klasse wirklich mit require oder include eingebunden wurde und die Klassen-Datei wird nur noch dann geladen, wenn sie tatsächlich gebraucht wird.

Und noch ein Tipp:
Mit Hilfe der Funktion spl_autoload_register($callback) lassen sich mehrere Autoloader gleichzeitig verwenden und können als Callback auch in eigene Klasse ausgelagert werden.

Die wichtigsten SEO Tipps

SEO ist in den letzten Jahren immer wichtiger geworden. Was viele nicht wissen: Es muss mehr getan werden, als nur die URL umzuschreiben. Nur weil ich der URL einen lesbaren Namen mitgebe, heißt das für Google und Co noch lange nicht, dass die Seite interessanter wird. Es gibt viel mehr Faktoren, die beim Ranking alle eine Rolle spielen. Und selbst wenn die Seite technisch perfekt für die SEO ausgestattet ist, zählt am Ende der eigentliche Inhalt der Seite. Für meine Tipps mache ich deshalb eine Aufteilung in einen technischen und einen redaktionellen Bereich. Für beide Bereiche ist es jedoch erst einmal wichtig, sich für eine Reihe von Keywords zu entscheiden, für die man eine Seite optimieren möchte. Erst danach macht es überhaupt Sinn, technische Änderungen durchzuführen. » Weiterlesen

PHP Magische Methoden

Diese Woche habe ich mir eines meiner Lieblingsthemen für PHP ausgesucht. Mit magischen Methoden kann man ziemlich coole Sachen anstellen. Insgesamt gibt es 8 magische Methoden, die man dadurch erkennt, dass sie alle mit zwei Unterstrichen beginnen: __construct(), __desctruct(), __toString(), __get(), __set(), __call(), __wakeup() und __sleep(). Ich gehe die Methoden einfach mal alle durch und bei der ein oder anderen kann ich auch ein kleines Anwendungsbeispiel vorstellen.

__construct()
Der Konstruktor: Diese Methode wird aufgerufen, sobald ein Objekt einer Klasse angelegt wurde – das sollte allerdings schon jedem bekannt sein. In PHP4 musste der Konstruktor noch den gleichen Namen wie die Klasse tragen, das ist aber seit PHP5 und der Einführung von __construct() nicht mehr notwendig. Das macht das Umbenennen von Klassen schonmal etwas leichter.

__destruct()
Der Destruktor: Wenn ein Objekt mit unset() gelöscht wird, wird kurz zuvor nochmal der Destruktor aufgerufen.

__toString()
Wenn ein Objekt als String verwendet wird, kann man mit dieser Methode die Ausgabe bestimmen. Beispiel:

class Katze
{
    protected $name = "";
    protected $farbe = "";
 
    public function __construct($name, $farbe)
    {
        $this->name = $name;
        $this->farbe = $farbe;
    }
 
    public function __toString()
    {
        return "Meine Katze {$this->name} ist {$this->farbe}.";
    }
}
$objekt = new Katze("Charly", "schwarz-weiß");
echo $objekt; // Meine Katze Charly ist schwarz-weiß.

Natürlich funktioniert __toString() nicht nur bei echo, sondern überall dort, wo ein String erwartet wird.

__get($var)
Wird aufgerufen, sobald eine nicht definierte Membervariable der Klasse gelesen wurde. Als Parameter bekommt diese Methode den gewünschten Variablen-Namen. Also: echo $objekt->nichtDefiniert

__set($var, $value)
Funktioniert ähnlich wie __get(), ist aber zum Schreiben. Also: $objekt->nichtDefiniert = true

__sleep() und __wakeup()
Wenn ihr mal ein Objekt mit serialize() abspeichern wollt, dann könnten diese Methoden recht hilfreich sein. __sleep() wird jeweils vor serialize() aufgerufen und __wakeup() vor unserialize(). Ich habe das bisher noch nicht gebraucht…

__call($funktion, $parameter)
Zum Schluss nochmal die interessanteste und zudem mein Favorit unter den magischen Methoden. Mit __call() können aufgerufene Methoden abgefangen werden, die gar nicht existieren. Das eignet sich hervorragend, um automatisch Setter- und Getter-Methoden zu generieren. Hier ein kleines Beispiel:

class Katze
{
    protected $dataArray = array();
 
    public function __construct(array $dataArray = null)
    {
        if(is_array($dataArray))
        {
            $this->dataArray = $dataArray;
        }
    }
 
    public function __call($funktion, $parameter)
    {
        $name = strtolower(substr($funktion, 3));
        switch(substr($funktion, 0, 3))
        {
            case "get":
                return $this->dataArray[$name];
            break;
            case "set":
                $this->dataArray[$name] = $parameter[0];
            break;
        }
    }
}
 
$objekt = new Katze();
$objekt->setName("Charly");
echo $objekt->getName();

Man kann und sollte das __call() natürlich noch etwas ausschmücken und Fehler abfangen, aber das ist der minimale Weg, um in PHP dynamische Getter- und Setter-Methoden zu generieren. Ich nutze diese Funktion inzwischen ziemlich häufig dafür, aber es gibt bestimmt noch bessere Anwendungsmöglichkeiten für __call().

Da fällt mir doch gleich das nächste Thema ein: Magische Funktionen. Darüber werde ich dann demnächst schreiben.