Originariamente inviato da URANIO
Ripeto per sentito dire(letto), non uso più il PHP da tempo e non ho mai testato.
Usavo require_once per includere le classi.
Sul motivo della lentezza, non so, è una ricerca in memoria.
Il resto del discorso sul require non capisco perché lo tiri fuori.
require ed include fanno esattamente la stessa identica cosa, quello che cambia sono le modalità con cui danno errore in assenza di file, per questo l'ho tirato fuori ... sono letteralmente la stessa cosa
una ricerca in memoria, su 10 elementi, 15 elementi, è così veloce che non è fisicamente conteggiabile ... ammesso che usi una lista, perché se usa un hashtable ... la velocità di ricerca è O(1), che per dirla in modo molto banale per acquisire/verificare un dato è necessaria un solo accesso alla struttura dati (ovviamente nel caso in cui si verifica una collisione, dipende tutto dall'algoritmo implementato)
------
tornando all'autoloader, generalmente il mio autoloader fa qualcosa tipo
codice:
public static function Initialize()
{
// Inizializza la lista delle path di ricerca e che la lista non è ancora stata riordinata
self::$includePaths = array();
self::$includePathsOrder = false;
// Imposta le estensioni abilitate per l'autoload
spl_autoload_extensions('.class.php');
// Registra l'auto load per le classi
spl_autoload_register('NemesiFW_Loader::_Autoload');
}
private static function _Autoload($ClassName)
{
// Verifica se la lista delle path di ricerca è stata riordinata o meno
if (self::$includePathsOrder == true)
{
self::ReorderIncludePath();
}
// Costruisce il nome del file della classe
$classFileName = str_replace('_', DIRECTORY_SEPARATOR, $ClassName) . '.class.php';
$classFileNameParts = explode(DIRECTORY_SEPARATOR, $classFileName);
$classFileNamePartsLength = count($classFileNameParts);
$classPath = '';
// Cerca il file nelle path di ricerca
$classIncluded = false;
foreach(self::$includePaths as $IncludePath)
{
// Verifica se il nome del file inizia con una parte del nome della directory
// di ricerca
$IncludePathParts = explode(DIRECTORY_SEPARATOR, $IncludePath['Path']);
array_pop($IncludePathParts);
$IncludePathPartsLength = count($IncludePathParts);
$maxLoops = min($IncludePathPartsLength, $classFileNamePartsLength);
$lengthToCut = 0;
for($loop = 0; $loop < $maxLoops; $loop++)
{
if ($IncludePathParts[$IncludePathPartsLength - (1 + $loop)] != $classFileNameParts[$loop])
{
break;
}
$lengthToCut += strlen($classFileNameParts[$loop]) + 1;
}
// Costruisce il nome del file
$classPath = $IncludePath['Path'] . substr($classFileName, $lengthToCut);
// Verifica se il componente esiste ed in caso lo include interrompendo il ciclo
if (file_exists($classPath) === true)
{
require_once($classPath);
$classIncluded = true;
break;
}
}
// Verifica se il componente è stato caricato
if ($classIncluded == false)
{
// Lancia un errore
self::Exception('Framework.Loader.ComponentMissingException',
sprintf('Component %s missing', $ClassName), array('ClassName' => $ClassName));
}
else
{
if (class_exists($ClassName) == false)
{
self::Exception('Framework.Loader.ComponentDoesntIncludeClassException',
sprintf("Component %s doesn't include class %s", $classPath, $ClassName),
array('ClassName' => $ClassName));
}
}
return false;
}
PS: è ancora in riscrittura/rielaborazione, attualmente non supporta i namespace ... non per motivi particolari ma perché, per adesso, nel codice utilizzo gli underscore (_) nei nomi delle classi
di conseguenza quando scrivo ad esempio
Framework_Core_Registry::Get('chiave')
Lui in automatico mi include Framework_Core_Registry e visto che questa classe estende Framework_Core_Object in automatico viene inclusa (in realtà questa è l'unica classe che carico manualmente, insieme al gestore delle eccezioni, in quanto mi fa da tramite per gestire le eccezioni)