2010-11-20 10 views
0

Ich benutze einen Autoloader um Klassen einzuschließen. Was ich gerade mache, ist "glob", um verschiedene Verzeichnisse zu lesen und sie in ein Array zu schieben. Gibt es dafür eine bessere Lösung?Lazy Classes Includes PHP

$path = './'; 

$files = array_merge(
glob($path.'includes/classes/system/*.class.php'), 
glob($path.'includes/classes/system/baseclasses/*.class.php'), 
glob($path.'includes/classes/system/systementities/*.class.php')); 

EDIT:

Ich benutze dies innerhalb einer Klasse automatisch geladen. Das Problem ist, dass ich nach den Dateien mit glob suchen muss. Gibt es einen schnelleren Weg, dies zu tun?

Antwort

1

Autoloading wird immer dann ausgelöst, wenn Sie versuchen, eine Klasse zu verwenden, die PHP nicht kennt. Wenn Sie include/require verwenden, wird PHP gehen durch alle Verzeichnisse, die Sie für Ihre include_path in PHP.ini angegeben, so sollte es keinen Grund glob zu verwenden. In Ihrem Fall soll es ausreicht, den include_path zu

/path/to/includes/classes/system/ 

Den schnellsten Weg zu setzen, um Dateien zu schließen wäre, ein class2file map zu verwenden. Dies erfordert jedoch, dass Sie eine solche Karte erstellen und sie beim Ändern Ihrer Anwendung auf dem neuesten Stand halten müssen.

+0

Aber hier brauche ich die Dateien auch. Der obige Code wird nicht geändert. Ich benutze bereits spl_autoload_register (wie die Tags zeigen) – Simon

+0

Was meinst du mit "Ich brauche die Dateien"? Wenn Sie eine Map benötigen, weil Sie glauben, dass die Suche auf dem include_path langsam ist, sollten Sie die Map mit einer beliebigen Strategie erstellen und irgendwo zwischenspeichern (einfache Datei, APC, Memcache). – timdev

+0

Klingt besser, ich werde es versuchen! – Simon

1

PHP hat dieses Problem bereits für Sie gelöst. Verwenden Sie PHP built-in autoloader. Rollen Sie niemals Ihre eigenen, wenn die Sprache/Rahmen es für Sie bereitstellt.

0

... was immer noch nicht der beste Weg ist, aber es bringt Sie mit glob(). Wenn Sie alle Ihre Systemeinstellungen laden, sollte in einem boot/config-Skript eine hartcodierte require() -Liste stehen. Es gibt viele Optionen zum Organisieren und Abrufen von Klassendateien. Um die Zeit für die Suche nach Skripten zu reduzieren, könnte man sich den Dateibaum als Schnittstelle vorstellen. Der Einfachheit halber könnten Sie alle nicht obligatorischen Klassen in demselben Ordner speichern und die Aufrufe von is_file() auf eins reduzieren.

In meinem System habe ich Objektklassen in Ordnern mit ihren jeweiligen Steuerskripts und Ansichten gruppiert. Meine __autoload() Funktion hat einen einfacheren Job -

$classfile = $path.$class.'/'.$class.'_class.php'; 
if (is_file($classfile)) require_once($classfile); 
+0

Ich verwende eine Singleton-Klasse, in der ich die Dateien speichere, also muss ich nur eine Isset-Prüfung anstelle der is_file-Prüfung durchführen – Simon