Kontakt aufnehmen

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

Du arbeitest in einer Agentur oder als Freelancer?
Dann wirf doch mal einen Blick auf unsere Software FeatValue.

Kommentare

Daniel Busch schrieb am 07.09.2009:

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.

Stefan Wienströer schrieb am 07.09.2009:

ok, coole Sache. Vielen Dank.

Renner schrieb am 10.10.2009:

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

Elvis67 schrieb am 27.12.2011:

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 &gt;= 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");

Elvis67 schrieb am 27.12.2011:

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') &gt;= 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!

Stefan Wienströer schrieb am 27.12.2011:

werd ich vielleicht mal einbauen.

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Cookie-Einstellungen

Helfen Sie dabei, uns noch besser zu machen. Wir nutzen Cookies und ähnliche Technologien, um die Website auf Ihre Bedürfnisse anzupassen. Zur Datenschutzerklärung

Auswahl speichern