Frage

In meinem include_path auf der Server-Seite habe ich einen Verweis auf eine Birne Verzeichnis, 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'.

Ich habe 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 versucht, eine Datei zu schließen und es mit @ zu unterdrücken, um zu sehen, ob es würde fehlschlagen, zum Beispiel @include 'library/file.php' aber ich denke, vor allem, weil ich viel über @ ist eine schlechte Praxis habe ich gelesen, manuell zu tun beschlossen, die Arbeit selbst durch get_include_path durch die PATH_SEPARATOR explodiert und zu sehen, ob das Verzeichnis ist, was ich will, es sein, dann ein 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');

Habe ich gehe in dem falschen Weg? Habe ich nur die @include Geschäfte gemacht oder bin ich es etwas in der richtigen Richtung zu tun?

War es hilfreich?

Lösung

Eine Sache, dass die Habari Projekt Autoloader tut die interessant ist, Cache der ganze Klasse Dateiliste im Speicher, so dass es zu tun Disk sucht ist nicht eine Klasse für die Dateien jedes Mal angefordert wird.

Im Wesentlichen deklarieren Sie eine statische in Ihrem __autoload(), die ein Array von all den Klassendateien, indiziert durch die Klasse hält, die sie verursacht zu laden. Zum Beispiel würde der Code Dir verwenden oder glob() diese statische Array zu erzeugen:

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

Dann schließen Sie einfach $class_files[$class] die richtige Datei zu erhalten. Das ist schön und schnell, weil sie den Katalog von der Festplatte auf einmal bekommt, anstatt die Liste zu erzeugen oder für einen bestimmten Dateinamen jedes Mal eine neue Klasse der Suche referenziert. (Sie wären überrascht, wie viel von einer Geschwindigkeitsdifferenz macht.)

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

include_once() soll vermieden werden, und die @ Betreiber ist nicht erforderlich, wenn Sie die Datei ausgecheckt haben einzubeziehen.

Andere Tipps

ich persönlich gehe den Weg mit

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

auch ohne @ erleichtern das Debuggen (Fehler werden heruntergefahren / angemeldet Produktion)

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top