我已经使用 spl_autoload_register 编写了自己的 ClassLoader。
优点是该函数查找从当前文件夹开始的每个子文件夹。
我只是简单地将这个文件包含在每个 PHP 文件中,而不必担心任何 include/require 指令。
它只是工作:-)
<?php
spl_autoload_register('AutoLoadClasses');
/************************************************************************************
* AutoLoadClasses
*
* Diese Funktion lädt Klassen in gleichnamigen Dateien bei Bedarf automatisch nach,
* sobald eine (bis dahin unbekannte) Klasse erstmalig instanziert wird.
* $var = new MeineKlasse; => Es wird nach der Datei class_MeineKlasse.php gesucht
* Die Suche erfolgt rekursiv in allen Unterordnern ausgehend von dem Ordner, in dem
* das aufrufende PHP-Script liegt.
*
* Michael Hutter / Dezember 2017
*/
function AutoLoadClasses($Klassenname, $StartOrdner = null)
{
if (is_null($StartOrdner))
{
$StartOrdner = __DIR__; # Ausgangspunkt für die Suche: Ordner, in dem sich das aufrufende PHP-Script befindet
$StartInstanz = true;
}
$ZielDateiname = "class_$Klassenname.php";
$FileList = scandir($StartOrdner, 1); # Sortierung 1 => kommt schneller zum Ziel, falls Ordnernamen im allgemeinen mit einem Großbuchstaben beginnen
foreach ($FileList as $file) # Alle Dateien und Ordner durchgehen
{
$Vollpfad = $StartOrdner.DIRECTORY_SEPARATOR.$file;
if (is_dir($Vollpfad) && (substr($file, 0, 1) !== '.')) # Ordner?
{
#echo "Ordner $StartOrdner<br>";
$result = AutoLoadClasses($Klassenname, $Vollpfad);
if ($result) return; # Abbruch, falls Ziel gefunden
}
else if (preg_match('/\.php$/i' , $file)) # .php-Datei?
{
#echo "$file<br>";
if ($file == $ZielDateiname) # Dateiname entspricht Klassenname?
{
include $Vollpfad;
return true; # Abbruch aller Rekursionen, da Ziel gefunden
}
}
}
if (isset($StartInstanz))
die("<table border bgcolor=red><tr><td>Fehler: Die Datei <b>$ZielDateiname</b> konnte in keinem der Unterordner gefunden werden!</td></tr></table>");
return false;
}
?>