2012-09-16 8 views
8

Öffnet der php class Autoloader eine Datei und sucht nach dem Klassennamen? Ich habe geschaut, wie es tatsächlich umgesetzt wird. Eine Sache, die ich weiß, dass es rekursiv ist? Wenn ich falsch bin mir bitteWie funktioniert der Php-Autoloader?

Wie erwähnt over wissen lassen: autoloader brief over view Wie PHP Autoloader arbeitet

Der PHP Autoloader sucht rekursiv in definierten Verzeichnissen für Klasse, Merkmal und Schnittstellendefinitionen. Ohne weitere Konfiguration wird das Verzeichnis, in dem sich die benötigte Datei befindet, als Standardklassenpfad verwendet.

Dateinamen müssen keiner Konvention entsprechen. Alle Dateien werden für Klassendefinitionen durchsucht. Dateien, die dem Klassennamen ähnlich sind oder mit .php oder .inc enden, werden bevorzugt. Falls unterstützt, wird PHP Tokenizer für die zuverlässige Definition von Klassendefinitionen verwendet.

+1

sieht aus wie der Link in Ihrer Frage ist gut genug zu wissen –

+0

"Öffnet Php-Klasse Autoloader eine Datei und sucht nach dem Klassennamen?" - Es durchsucht alle Klassen in einer Datei. – zerkms

+0

aber wo kann ich erfahren, wie es implementiert, von Grund auf den gesamten Prozess der Autoloader das ist, was für mich interessant ist, wie seine erste geschriebene – meWantToLearn

Antwort

14

Der PHP Autoloader ist nur ein Mechanismus umfassen eine Datei wenn ein Klasse aufgebaut ist.

Wenn Sie alle Ihre Klassen in eine Datei einfügen, benötigen Sie keinen Autoloader. Natürlich, wenn Sie mit der Programmierung OO jede Klasse eine eigene Datei geben, und das ist, wo kommt der Autoloader in

Einige Beispiele:.

class AutoLoader 
{ 
    public function __construct() 
    { 
    spl_autoload_register(array($this, 'ClassLoader')); 
    } 

    public function ClassLoader($class) 
    {  
    if(class_exists($class, false)) 
     return true; 

    if(is_readable('path_to_my_classes/' . $class . '.php')) 
      include_once 'path_to_my_classes/' . $class . '.php' 
    } 
} 

$autoloader = new AutoLoader(); 

Was hier passiert, ist, dass, wenn der Autoloader-Klasse erstellt wird, die Klasse Methode Der Classloader ist als Autoloader registriert.

Wenn eine neue Klasse erstellt wird, prüft die Classloader-Methode zunächst, ob die Datei für die Klasse bereits geladen ist. Wenn nicht, wird der Klasse ein Pfad vorangestellt und um eine Erweiterung erweitert. Wenn die Datei lesbar ist, ist sie enthalten.

Natürlich können Sie dies sehr anspruchsvoll machen. Schauen wir uns ein Beispiel mit Namespaces und einem Mapper an. Angenommen, wir in der Autoloader Klasse sind:

private $mapper array('Foo' => 'path_to_foo_files/', 'Bar' => 'path_to_bar_files/'); 

    public function ClassLoader($class) 
    {  
    if(class_exists($class, false)) 
     return true; 

    // break into single namespace and class name 
    $classparts = explode('\\', $class); 
    $path = $this->mapper[$classparts[0]]; 

    if(is_readable($path . $classparts[1] . '.php')) 
      include_once $path . $classparts[1] . '.php' 
    } 

Hier ist der Klassenname splittet in einem Namespace Teil und ein Klassenname Teile. Der Namespace-Teil wird in einem Mapper-Array nachgeschlagen, und dieser Pfad wird dann als Include-Pfad für die PHP-Datei verwendet.

Dies sind nur Beispiele, die zeigen, was mit einem Autoloader getan werden kann. Für die Produktion braucht es noch etwas mehr zu tun, beispielsweise eine Fehlerprüfung.