ContentLion - Open Source CMS
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.

  1. Daniel Busch
    7. September 2009 @ 07:44

    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. Stefan Wienströer
    7. September 2009 @ 12:33

    ok, coole Sache. Vielen Dank.

  3. Renner
    10. Oktober 2009 @ 20:35

    Sehr schön gelöst ihr beide! ;)
    weiter zum nächsten schritt

  4. Elvis67
    27. Dezember 2011 @ 00:08

    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”);

  5. Elvis67
    27. Dezember 2011 @ 00:27

    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!

  6. Stefan Wienströer
    27. Dezember 2011 @ 13:45

    werd ich vielleicht mal einbauen.

Fragen zum CMS-Tutorial?

Dafür gibt es jetzt ein Forum! Einfach in der CMS Beratung unter "Hilfe fürs CMS Tutorial" eine Frage stellen und Antworten bekommen.

Die Vorteile zum Kommentar:

  • Jede Frage bekommt mehr Aufmerksamkeit, da die unteren Kommentare der Artikel nicht so oft gelesen werden
  • Durch die Suche kann man auf fertige Lösungen von anderen zurückgreifen.

Hinterlasse einen Kommentar

Entschuldige, das Kommentarformular ist zurzeit geschlossen.