Funzione PHP __autoload ($ class_name) come caricare due directory del percorso di classe

3

Sto usando la seguente funzione per le classi di caricamento automatico, funziona bene se sto usando solo una directory chiamata 'classes', tuttavia quando provo a usare Smarty lib anche fallisce e mi dà l'errore

Fatal error: Class 'Database' not found in /home/...

per esempio:

require_once(DOC_ROOT."/libs/Smarty.class.php");
function __autoload($class_name) {   
    require_once( CLASS_LIB."/".$class_name . '.class.php');
}
$db = new Database();
$session=new Session();
$smarty = new Smarty();

ma se lo faccio mi dà l'errore di non riuscire a caricare la classe smarty ..

function __autoload($class_name) {   
    require_once( CLASS_LIB."/".$class_name . '.class.php');
    require_once(DOC_ROOT."/libs/Smarty.class.php");
}

$db = new Database();
$session=new Session();
$smarty = new Smarty();

Warning: require_once(/home/.../classes/Smarty_Internal_TemplateCompilerBase.class.php) [function.require-once]: failed to open stream: No such file or directory in /home/.../includes/init.php 

Qualche idea su cosa sto facendo di sbagliato qui? Devo essere in grado di caricare automaticamente la directory delle classi, ma devo assicurarmi di non perdere il percorso smarty ..

    
posta user1179459 15.07.2012 - 06:42
fonte

2 risposte

2

Risolvo il problema con la funzione spl_autoload_register due volte.

di seguito è riportato il codice per riferimento.

spl_autoload_register('load_api');
spl_autoload_register('load_lib');

function load_api($class){
    if(!file_exists(CLASS_LIB."/".$class. '.class.php') )
        return false;
    require_once( CLASS_LIB."/".$class. '.class.php');
    return true;
}
function load_lib($class){
    if( !file_exists(DOC_ROOT."/libs/Smarty.class.php") )
        return false;
    require_once(DOC_ROOT."/libs/Smarty.class.php");
    return true;
}
    
risposta data 16.07.2012 - 12:09
fonte
5

Mi vengono in mente diverse soluzioni.

  • Utilizza include_once anziché require_once per evitare l'errore.
  • Verifica l'esistenza del file prima di fare require_once.
  • Inserisci un'istruzione if se rileva Smarty e casi speciali il codice.
  • Basta inserire manualmente le classi Smarty.
  • (Migliore) Usa spl_autoload_register due volte, una volta per le tue classi e una volta per le classi Smarty. __autoload è deprecato. Spl_autoload_register dovrebbe gestire il problema. link
risposta data 15.07.2012 - 07:10
fonte

Leggi altre domande sui tag