Ho sperimentato tecniche di mappatura delle directory del caricatore automatico ed è stato un po 'difficile. Sono riuscito a trovare una soluzione abbastanza semplice (in superficie), ma sono totalmente confuso che funzioni, mentre altre soluzioni "più ovvie" hanno fallito. Di seguito sono riportati alcuni frammenti di codice che illustrano la mia confusione.autoloader php: perché funziona?
Ecco il codice di lavoro:
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
$classMap = array(
'classes/',
'classes/sites/',
'classes/data/'
);
foreach ($classMap as $location) {
if ([email protected]_once($location . $class . '.php')) { // @ SUPPRESSES include_once WARNINGS
// CLASS DOESN'T EXIST IN THIS DIRECTORY
continue;
} else {
// CLASS IS AUTO-LOADED
break;
}
}
}
?>
Ecco un frammento che mi sentivo dovrebbe lavoro, ma non lo fa:
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
$classMap = array(
'classes/',
'classes/sites/',
'classes/data/'
);
foreach ($classMap as $location) {
if (file_exists($location . $class . '.php')) {
require_once ($location . $class . '.php');
}
}
}
?>
Quest'ultimo ha più senso per me perché mentre questi due versioni funzionano:
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
require_once ('classes/sites/' . $class . '.php');
}
?>
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
$location = 'classes/sites/';
require_once ($location . $class . '.php');
}
?>
Questo getta "Nessun file o directory ..." (notare la mancanza di "siti /" nel percorso.
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
require_once ('classes/' . $class . '.php');
}
?>
Il "No such file or directory ..." errore mi ha fatto pensare che potrei semplicemente verificare la presenza di file di supporto di una classe e, se (file_exists()) {require_once(); break;} else {continue;}
Perché non funziona? E perché il primo frammento funziona? Il percorso/file di supporto non viene mai esplicitamente incluso o richiesto.
è la directory padre del percorso delle classi in include_paths? – Orangepill
Il file di supporto è incluso, è solo combinato nella dichiarazione if: if (! @include_once ($ location. $ Class. '.php')) –
Sì, stavo pensando che, john500, ma speravo nella conferma , quindi grazie per quello. Mi sembra un modo molto sciatto per ottenere ciò di cui ho bisogno, quindi questo mi limita a raddoppiare il prurito per migliorare la soluzione. Orangepill, non sono sicuro di come farlo ... Non ho lavorato con PHP per un po ', e quando l'ho fatto l'ultima volta, non ero tanto bravo a programmare quanto sono ora ... quindi sto praticamente hackerando PHP cercando di fare cose che so già fare in Java e ColdFusion;). –