spl_autoload_register tenta di caricare una classe con dipendenze
-
21-12-2019 - |
Domanda
Quanto è intelligente spl_autoload_register?Sappi di "guardare avanti" per la definizione di classe in altri file prima di provare a includere?
Quando eseguo la mia pagina indice.php sto vedendo Errore irreversibile: Input della classe \ Input 'non trovato in /var/www/php/classes/input/date.php on line 4
Index.php esegue il seguente (dopo questo blocco crea un oggetto da una delle classi, se non comprometto la riga che tutto funziona perfettamente)
function my_autoloader() {
//include_once "/var/www/php/classes/input/input.php"; //if this is uncommented, it fixes the problem, but I'm not sure why
foreach (glob("/var/www/php/classes/*/*.php") as $filename)
{
require_once $filename;
}
}
spl_autoload_register('my_autoloader');
.
è il mio sintasso sbagliato?Spl_autoload_register dovrebbe funzionare in questo modo?Molti altri file in queste cartelle dipendono l'altro e il caricatore automatico sembra "capirlo".Non sono sicuro del motivo per cui è improvvisamente riattaccato sulla classe "input" in particolare
Soluzione
Stai usando il caricatore automatico in modo sbagliato.Si suppone solo caricare le classi necessarie per una richiesta specifica, non l'intera cartella.
Leggi di più sulle classi di autoloading correttamente con alcuni buoni esempi: https://github.com/php-fig/fig-standards/blob/master/accettato/psr-0.md
Altri suggerimenti
Lo stai usando in modo errato.
.
Autoload viene utilizzato per autoloading solo il nome della classe specificato sul 1 ° argomento di callback, non per caricare tutte le classi come stai facendo.
Ad esempio:
spl_autoload_register(function ($class) {
// ...
$class = stream_resolve_include_path(sprintf("%s.php", $class));
if ($class !== false) {
require $class
}
});
.
$class
contiene la classe per caricarlo, quindi è possibile utilizzarlo per trovare il file contenente questa classe sul tuo filesystem.