2013-02-13 8 views
6

C'è qualche modo per me di distinguere tra tratti e classi nella mia funzione di caricamento automatico? Diciamo che ho una cartella di classi e una cartella di tratti; sarebbe bello essere in grado di fare qualcosa di simile ...Caratteri di autocaricamento in PHP

spl_autoload_register(function($resource) { 
    if (/* $resource is class */) { 
    include 'classes/'.$resource.'.php'; 
    } 
    if (/* $resource is trait */) { 
    include 'traits/'.$resource.'.php'; 
    } 
}); 
+1

vostro probabilmente desidera modificare il secondo 'if' a' elseif' – shnisaka

+0

non sembra probabile. Non ci sono informazioni oltre al nome del simbolo passato al callback. Probabilmente dovresti sollevare un bug con PHP – Phil

+0

@shnisaka che non ha senso. Perché usare 'elseif' se le condizioni si escludono a vicenda? – Phil

risposta

4

La funzione di caricamento automatico di callback riceve solo un pezzo di informazione; il nome del simbolo richiesto. Non c'è modo di vedere quale tipo di simbolo dovrebbe essere.

Che cosa si potrebbe fare è registrare più funzioni nello stack di caricamento automatico, uno per gestire le classi e gli altri tratti, utilizzando stream_resolve_include_path() o qualcosa di simile, per esempio

spl_autoload_register(function($className) { 
    $fileName = stream_resolve_include_path('classes/' . $className . '.php'); 
    if ($fileName !== false) { 
     include $fileName; 
    } 
}); 
spl_autoload_register(function($traitName) { 
    $fileName = stream_resolve_include_path('traits/' . $traitName . '.php'); 
    if ($fileName !== false) { 
     include $fileName; 
    } 
}); 
+0

Grazie, la mia soluzione rapida era usare 'file_exists()'. Non ho mai usato 'stream_resolve_include_path()' prima e la documentazione è abbastanza vaga ... cosa fa esattamente? E quali sono i vantaggi con la registrazione di due funzioni di caricamento automatico? –

+0

@savinger Bene, 'include' usa il' include_path' configurato. 'file_exists()' non lo sa, mentre 'stream_resolve_include_path()' fa. Restituisce 'false' se non può risolvere il percorso indicato contro lo stack' include_path' – Phil

0

C'è una soluzione semplice nel modo di nome i tuoi tratti. Ogni tratto della mia applicazione è denominato trait_ (nome) e viene inserito nella cartella delle classi.

Ad esempio my trait_something viene inserito nella classe/cartella con il nome file "trait.trait_something.php".

La mia funzione di caricamento automatico in grado di raccogliere sia i tratti o le classi:

function autoloader($class) 
{ 
    $prefix='classes/'; 
    $ext='.php'; 
    if(substr($class,0,6) == 'trait_')include $prefix.'trait.' . $class . $ext; 
    else include $prefix.'class.' . $class . $ext; 
}