0251 / 590 837 15
info@a-coding-project.de

Autoloader für PHP erstellen

In der professionellen Programmierung mit PHP ist Objektorientierung heutzutage nicht mehr wegzudenken. Wer die ersten Klassen in einem neuen Projekt erstellt wird häufig einfach ein paar require_once o.Ä. einbauen, um die Klassen zu Laden. Doch in großen Projekten mit einer Vielzahl an Klassen sollte man sich hier eine passende Struktur und einen Autoloader anlegen, der die Klassen automatisiert lädt. Das require entfällt in dem Fall.

Ausgangssituation:

<?php
  require_once 'classes/myclass.php';

  $object = new MyClass();

Die __autoload-Funktion

Die einfachste Weise die Klassen in PHP automatisiert zu laden ist, die __autoload-Funktion zu überschreiben. Sie wird mit dem Klassennamen als Parameter aufgerufen:

<?php
  function __autoload($class_name)
  {
    require_once 'classes/'.strtolower($class_name).'.php';
  }
  
  $object = new MyClass();

Nun wird die Datei importiert, wenn die MyClass benutzt werden soll. Das heißt, wenn aus ihr eine neue Instanz erstellt werden soll, aber auch einfach wenn eine statische Funktion aufgerufen wird.

Mehrere Autoloader mit spl_autoload_register

Seit PHP 5.1.2 ist es auch möglich mehrere Autoloader zu registrieren. Hat ein Autoloader eine Klasse nicht gefunden, wird der nächste aufgerufen. Dieses Prinzip ist vor allem bei Frameworks anzutreffen. Denn diese haben in der Regel eine eigene Verzeichnisstruktur, die nicht zu euer passt. So müssen die Klassen des Frameworks aber auch eure eigenen richtig geladen werden.

Ist auch nicht so schwer:

<?php
  function my_autoload($class_name)
  {
    $file = 'classes/'.strtolower($class_name).'.php';
    if(file_exists($file))
    {
      require_once($file);
    }
  }
  spl_autoload_register('my_autoload');
  
  $object = new MyClass();

Der Autoloader, der zuerst registriert wird, wird auch als erstes aufgerufen.

Autoloader mit Namespaces

Wer bereits Namespaces nutzt, kann diese hervorragend in der Verzeichnisstruktur nutzen. Mit dem Namespace custom könnte das Beispiel so aussehen:

<?php
  function my_autoload($class_name)
  {
    $file = 'classes/'.strtolower(str_replace('\','/',$class_name)).'.php';
	
    if(file_exists($file))
    {
      require_once($file);
    }
  }
  spl_autoload_register('my_autoload');
  
  $object = new customMyClass();

Die Klasse wird in dem Fall aus der Datei /classes/custom/myclass.php geladen.

Einen Autoloader als Klasse

Ich würde den Autoloader im Idealfall so simpel wie möglich halten, denn ein vollgepackter Autoloader deutet auf eine unübersichtliche Struktur des Projektes hin. Da macht es mehr Sinn, dort einmal aufzuräumen, damit ihr auch selbst einen Überblick darüber habt, was ihr wo findet.

Wer um eine komplexere Struktur aber nicht herum kommt, der kann den Autoloader auch als eigene Klasse anlegen. Das könne man zum Beispiel so machen:

<?php
  class Autoloader
  {
    public function __construct()
    {
      spl_autoload_register(array($this, 'load_class'));
    }
    
    public static function register()
    {
      new Autoloader();
    }
    
    public function load_class($class_name)
    {
      $file = 'classes/'.strtolower(str_replace('\','/',$class_name)).'.php';
      if(file_exists($file))
      {
        require_once($file);
      }
    }
  }
  
  Autoloader::register();
  
  $object = new customMyClass();

Zu beachten ist hier, dass der Autoloader selbst natürlich nicht per Autoload geladen wird. Hier müsste dann ein require_once o.Ä. verwendet werden.

Weiteres zum Thema

Kommentare

Henning schrieb am 06.03.2014:

Es gibt neben der Möglichkeit einen eigenen Autoloader zu schreiben auch noch die Variante den default Autoloader von PHP zu nutzen. Wenn es nur darum geht einfach eine Klasse einzubinden ist das schneller als wenn man sich seine eigene Funktion schreibt da der default Loader in C geschrieben ist. // --- DER WEG ZU DEINER KLASSE IN EINER KONSTANTEN define(CLASS_DIR,'DER PFAD ZU DEINEN KLASSEN'); // --- DEN INCLUDEPATH UM DEINEN KLASSEN VERZEICHNIS ERWEITERN set_include_path(get_include_path().PATH_SEPARATOR.CLASS_DIR); // --- WEITERE EXTENSIONS ZUM AUTOLOADER HINZUGEBEN spl_autoload_extensions(spl_autoload_extensions().',.class.php'); // --- VERWENDEN DES DEFAULT AUTOLOADER spl_autoload_register();