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.

Weiterlesen

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.