2009-11-11 9 views
5

In meinem include_path auf der Server-Seite ich einen Verweis auf eine Birne Verzeichnis haben, in '/ usr/share/Birne /'. In meinen Anwendungen umfasse ich Dateien aus einer gemeinsamen Bibliothek, das Leben in '/ usr/share/Birne/library /' mit require_once 'library/file.php'.SPL Autoloading Best Practices

ich vor kurzem die spl Autoloader verwendet haben begonnen, bemerkte ich in der Ladefunktion Sie, mit dem die Logik, um zu bestimmen haben, die Datei zu schließen. Mein erster Weg, dies zu tun, war zu versuchen, eine Datei einzuschließen und sie mit @ zu unterdrücken, um zu sehen, ob sie fehlschlagen würde, z. @include 'library/file.php' aber ich denke, vor allem, weil ich viel über @ ist eine schlechte Praxis habe ich beschlossen, lesen Sie die Arbeit selbst manuell zu tun, indem get_include_path durch die PATH_SEPARATOR explodiert und zu sehen, ob das Verzeichnis ist, was ich es sein will, dann eine file_exists tun und es einschließlich .

Wie so:

function classLoader($class) { 
    $paths = explode(PATH_SEPARATOR, get_include_path()); 
    $file = SITE_PATH . 'classes' . DS . $class . '.Class.php'; 
    if (file_exists($file) == false) 
    { 
     $exists = false; 
     foreach ($paths as $path) 
     { 
      $tmp = $path . DS . 'library' . DS . 'classes' . DS . $class . '.Class.php'; 
      if (file_exists ($tmp)) 
      { 
      $exists = true; 
      $file = $tmp; 
      } 
     } 
     if (!$exists) { return false; } 
    } 
    include $file; 
} 

spl_autoload_register('classLoader'); 

Gehe ich den falschen Weg? Sollte ich gerade das @include Geschäft gemacht haben oder mache ich es etwas in die richtige Richtung?

Antwort

6

Eine Sache, die das Habari project autoloader interessant ist, ist, die gesamte Klassendateiliste im Speicher zwischenzuspeichern, so dass es nicht jedes Mal, wenn eine Klasse angefordert wird, nach den Dateien sucht.

Im Wesentlichen deklarieren Sie eine statische innerhalb Ihrer __autoload(), die ein Array aller Klassendateien enthält, die von der Klasse indiziert werden, die zum Laden führt. Zum Beispiel würde der Code verwenden Dir oder glob() diese statische Array zu erzeugen:

$class_files = array(
    'user' => '/var/www/htdocs/system/classes/user.class.php', 
); 

Dann einfach Sie $class_files[$class] umfassen die richtige Datei zu erhalten. Das ist nett und schnell, weil es den Katalog von der Festplatte auf einmal abruft, anstatt die Liste zu generieren oder jedes Mal nach einem bestimmten Dateinamen zu suchen, wenn eine neue Klasse referenziert wird. (Sie wären überrascht, wie viel Geschwindigkeitsunterschied es macht.)

Wenn der Klassenname kein Schlüssel im Array ist, können Sie eine benutzerdefinierte Ausnahme auslösen oder eine Stub/Mock-Klasse zum Zurückgeben generieren. Auch, wenn Sie das Habari System Autoloader überprüfen, sehen Sie, dass Habari __static() in Klassen implementiert, die automatisch geladen werden, die wie ein Konstruktor für statische Klassen ist.

include_once() ist zu vermeiden, und der Operator @ ist nicht erforderlich, wenn Sie nach der Datei zum Einschließen überprüft haben.

1

gehe ich persönlich den Weg

function autoload($class) { 
    /* transform class name into filename ... */ 
    include $class; 
} 

auch ohne das @ mit Debugging zu erleichtern (Fehler werden heruntergefahren/in Produktion angemeldet)

könnten Sie auch die damit verbundene Diskussion über die PHP interessiert sein Entwickler-Liste: http://marc.info/?t=125787162200003&r=1&w=2

+3

Ist nicht die spl die praktischere und moderne Methode selbstladende? Oder sind sie im Grunde dasselbe? –