Benötigte Klassen automatisch laden

Code & Blog Logo

Code & Blog Logo

In unseren beiden index.php gibt es nun bereits schon Zahlreiche includes. Das ist natürlich immer ein bisschen unschön. Wir müssen nämlich diese Liste immer Pflegen. Das geht auch anders: Mit der Funktion __autoload kann man diese  automatisch laden lassen. Danke Markus für diesen Hinweis ;-)

Da diese Funktion erst in PHP5 verfügbar ist, müssen wir auch auf PHP5 umsteigen. Ich (Seite auf 1&1 gehostet) musste dafür meine .htaccess erweitern.

Aber da bei den meisten Hostern PHP5 bereits Standard ist, gehe ich da nun nicht weiter drauf ein.

In PHP5 bekommen wir auch eine Fehlermeldung, die anzeigt, wenn eine Datei falsch included ist. Das hat mich darauf hingewiesen, dass wir noch gar keine 404 Datei angelegt haben, die wir aber bereits inlcuden. Also mal schnell die Datei /content/articles/errors/404.php angelegt:

<h1>Diese Seite wurde nicht gefunden!</h1>

Nun geht’s zum Autoload. Da diese Funktion auch mir noch neu war, werde ich sie mal ganz kurz erklären.

Diese Funktion wird aufgerufen, wenn eine Klasse nicht gefunden wurde. Als Parameter wird dann der Klassenname übergeben. So kann man dann über den Klassennamen die passende Datei importieren. Dadurch haben wir sogar nochmal den Vorteil, dass wir nicht alle Klassen importieren, sondern nur die, die auch benötigt werden.

Das Problem ist, dass wir wissen müssen, in welcher Datei welche Klasse liegt. Ich habe mir dort überlegt, alle Dateien wie die Klasse zu benennen, nur komplett kleingeschrieben. Dafür müssen wir noch aus unserer /system/classes/MySQL.php eine /system/classes/mysql.php machen.

Nun geht’s in die index.php aus dem Hauptverzeichnis. Hier kommt die neue Autoload-Funktion rein. Außerdem werden alle Klassen-Includes entfernt:

<?PHP
  function __autoload($class_name){
      require_once "system/classes/".strtolower($class_name).".php";
  }
  include("system/dbconnect.php");
  include("system/settings.php");
  include("system/filterfilename.php");
  include("system/sys.php");
  $currentpage = new Page();
  $currentpage->loadProperties(mysql_real_escape_string($_GET['include']));
  include(SkinController::getCurrentSkinPath()."/index.php");
?>

Das sind zwar bisher nur drei includes die wegfallen, aber es werden bestimmt irgendwann mehr ;-) Da wir auch noch nicht alles in Klassen machen, bleiben ein paar includes über. Mal sehen, ob ich das irgendwann mal ändere.

Nun kommt noch die /admin/index.php dran. Hier ist das gleiche Spiel nochmal:

<?PHP
  session_start();
  function __autoload($class_name){
      require_once "../system/classes/".strtolower($class_name).".php";
  }
  include("../system/dbconnect.php");
  include("../system/settings.php");
  include("../system/filterfilename.php");
  include("../system/sys.php");
...

Ab jetzt kann ich auch nicht mehr vergessen, im Blogbeitrag das Include mitaufzuführen XD

Dies ist ein Beitrag aus der Aktion Code & Blog, in der hier ein eigenes CMS erstellt wird.

Teilen macht Spaß:

  • Facebook
  • Twitter
  • Google Plus
  • Delicious
  • Mister Wong
  • Reddit
  • LinkedIn
  • StumbleUpon
  • Email
  • RSS

Stefan Wienströer

Entwickler aus Leidenschaft.

6 Gedanken zu “Benötigte Klassen automatisch laden

  1. Ich durfte auch ein upgrade meiner Domain machen. Aber so habe ich drei Monate Kostenlos und 4 Datenbanken mehr (mal sehen wofür ich die verwenden soll (3 Foren und zwei CMSe ^^.

    MfG

    Daniel.

    PS.: Ich baue gerade am “Dateisystem”. Wenn es dich nicht stört, würde ich daran weiter machen. Gut das ich in einer IT-Abteilung arbeite und das als Weiterbildung ansehen kann.
    Zur Zeit habe ich das Uploadscript mit Dateiauflistung fast fertig. Ich versuche noch die Dateien auch im CMS nutzbar zu machen. Aber das sollte nicht die Schwierigkeit sein. Wenn es dann fertig ist würde ich dir die gepackten Dateien mit kleiner readme (wobei ich denke das Du mit deinen Kenntnissen es auch ohne verstehen würdest)an bekannt Adresse schicken.

  2. Wie es scheint, ist mittlerweile die Funktion __autoload nicht mehr zeitgemäß und wird vermutlich irgendwann rausfliegen. Ich habe ein wenig recherchiert: Wir verwenden ja PHP >= 5, dort gibt es die Möglichkeit, eine eigene Autoload-Funktion quasi zu registrieren:

    Ich habe das so gelöst:

    function cmsAutoload ($class_name) {
    require_once “system/classes/”.strtolower($class_name).”.php”;
    }
    spl_autoload_register(“cmsAutoload”);

  3. Noch eine kleine Verbesserung: Die Funktion spl_autoload_registrer wurde erst in php 5.1.2 eingeführt. Man sollte also vor der Verwendung dieser Funktion die PHP Version checken. Glücklicherweise gibt es für die PHP-Version eine Serverkonstante namens PHP_VERSION, hier also der verbesserte Autoloader:

    if (version_compare(PHP_VERSION, ’5.1.2′) >= 0) {
    function cmsAutoload ($class_name) {
    require_once “../system/classes/”.strtolower($class_name).”.php”;
    }
    spl_autoload_register(“cmsAutoload”);
    } else {
    function __autoload($class_name){
    require_once “../system/classes/”.strtolower($class_name).”.php”;
    }
    }

    Macht Spaß, diesem Tutorial zu folgen!

Kommentare sind geschlossen.