2016-08-30 3 views
1

Ich versuche, Autoloading meiner Klassen zu implementieren. Ich trenne meine Klassen in zwei verschiedenen Ordnern:PHP: spl_autoload_register versucht, Dateien aus falschem Verzeichnis zu laden

/classes 
/external 

In meinem external Ordner, halte ich alles von Drittanbietern, die ich in meiner Anwendung verwende. Es kann Klassen, Funktionen usw. enthalten. Ich halte das gerne getrennt von meinem eigenen Code.

Ich möchte alles manuell in das external Verzeichnis aufnehmen. Ich möchte nur, dass Dateien im Verzeichnis classes automatisch geladen werden. Hier ist, was ich habe:

Dateien:

/classes/cache.class.php 
/classes/db.class.php 
/classes.mail.class.php 
/external/hooks.php 

und automatisch zu laden:

spl_autoload_register(function ($class_name) { 
    include dirname(__FILE__).'/classes/'.$class_name.'.class.php'; 
}); 

$Cache = new cache(); 
$Db = new db(); 
$Mail = new mail(); 

Irgendwie dies versucht, eine Klasse zu laden, die im external Verzeichnis vorhanden ist. Ich weiß das, weil in hooks.php ich habe:

class Hooks { ... } // Notice the capital H 

Und ich erhalte die Fehlermeldung:

„Warning: include (/path/to/classes/Hooks.class.php): failed to open stream : Keine solche Datei oder kein Verzeichnis "

Wie kann ich spl_autoload_register erhalten, um alle Klassen zu ignorieren, die außerhalb des Verzeichnisses classes existieren?

Antwort

0

dieses

if (file_exists(dirname(__FILE__).'/classes/.$class_name.'.class.php')) 

Recht hinzufügen, bevor Ihr

+0

Danke. Ich verstehe einfach nicht, warum es in anderen Verzeichnissen sucht und nicht in der angegebenen bleibt. Kannst du erklären warum? – JROB

+0

Da Sie nicht den ganzen Code zeigen, insbesondere den Code, der 'spl_autoload_register' aufruft, kann ich Ihnen keine gute Antwort geben. Wahrscheinlich, was auch immer es anruft, hat eine voreingestellte Liste, um es zuerst zu versuchen. – Forbs

1

Der Autoloader enthalten keine Möglichkeit zu wissen, in welchem ​​Ordner ist eine Klasse definiert ist. Der allgemeine Ablauf ist:

  • Siehe eine undefinierte Klasse im Code verwendet wird
  • Rufen Sie alle Funktionen mit dem spl_autoloader registriert ausgeführt wird, und sie den undefinierten Klassenname übergeben

Da Sie didn Wenn die Datei nicht vorhanden ist, wird die Autoloader-Funktion, die Sie registriert haben, immer dann ausgeblendet, wenn Sie eine nicht automatisch geladene Klasse vor der Verwendung nicht einfügen. Wie @Forbs in seiner Antwort erwähnt, fügen Sie einfach einen Check in Ihre Autoloader-Funktion ein, um zu sehen, ob die Datei existiert, bevor Sie die Quelldatei hinzufügen.

Es ist erwähnenswert, dass Composer diesen Job für Sie bereits sehr gut erledigt - es sei denn, Sie haben einen bestimmten Grund, Ihren eigenen Autoloader zu verwenden, würde ich vorschlagen, Komponist für Ihr Projekt einzurichten.

https://getcomposer.org/doc/00-intro.md

Verwandte Themen