2010-04-13 5 views
7

Ich habe über dynamischen Laden Sie Ihre Klassendateien lesen, wenn in einer Funktion wie folgt benötigt:Ersatz für PHP __autoload Funktion?

function __autoload($className) 
{ 
    include("classes/$className.class.php"); 
} 

$obj = new DB(); 

die automatisch DB.class.php geladen wird, wenn Sie eine neue Instanz dieser Klasse zu machen, aber ich habe auch in einigen Artikeln gelesen, dass Es ist schlecht, dies zu verwenden, da es eine globale Funktion ist und alle Bibliotheken, die Sie in Ihr Projekt mitbringen, die eine __autoload() Funktion haben, werden es vermasseln.

Kennt also jemand eine Lösung? Vielleicht eine andere Möglichkeit, den gleichen Effekt wie __autoload() zu erzielen? Bis ich eine passende Lösung finde, werde ich einfach weitermachen mit __autoload(), da es nicht zu einem Problem wird, bis Sie Bibliotheken und ähnliches einbringen.

Danke.

Antwort

10

ich den folgenden Code verwendet haben spl_autoload_register in einer Art und Weise zu verwenden, dass es verschlechtern, wenn es isn 't vorhanden, und behandeln auch Bibliotheken, die __autoload verwenden, die Sie einschließen müssen.

//check to see if there is an existing __autoload function from another library 
if(!function_exists('__autoload')) { 
    if(function_exists('spl_autoload_register')) { 
     //we have SPL, so register the autoload function 
     spl_autoload_register('my_autoload_function');  
    } else { 
     //if there isn't, we don't need to worry about using the stack, 
     //we can just register our own autoloader 
     function __autoload($class_name) { 
      my_autoload_function($class_name); 
     } 
    } 

} else { 
    //ok, so there is an existing __autoload function, we need to use a stack 
    //if SPL is installed, we can use spl_autoload_register, 
    //if there isn't, then we can't do anything about it, and 
    //will have to die 
    if(function_exists('spl_autoload_register')) { 
     //we have SPL, so register both the 
     //original __autoload from the external app, 
     //because the original will get overwritten by the stack, 
     //plus our own 
     spl_autoload_register('__autoload'); 
     spl_autoload_register('my_autoload_function');  
    } else { 
     exit; 
    } 

} 

So wird dieser Code überprüft für eine bestehende __autoload Funktion, und fügen Sie sich auch auf den Stapel als eigenes (weil spl_autoload_register das normale __autoload Verhalten deaktivieren).

+0

entnommen. Eine gute Lösung, obwohl ich die geringfügige Änderung der Verwendung von spl_autoload sowieso vornehmen würde, unabhängig von der bestehenden Autoload, einfach die __autoload Funktion splitten, wenn sie existiert, dann splad Ihre Funktion. – Aatch

+0

Ja, Sie können das tun, obwohl, wenn ich Sie richtig verstehe, Sie nur effektiv austauschen, wenn Aussagen um wirklich damit. – Kazar

3

Verwenden Sie spl_autoload_register anstelle von __autoload. Dadurch können Sie Ihre Autoload-Funktion in den Stapel hinzufügen.

+0

Ich denke 'spl_autoload_register' clobbers alle vorhandenen' __autoload' Funktion, so dass, wenn eine Bibliothek nutzt, sind Sie die Funktion der Bibliothek auszulöschen. Wenn zwei Bibliotheken beide eine "__autoload" -Funktion definieren, ist das sowieso schon ein wenig schief! –

+0

Wenn Ihr Code eine vorhandene __autoload-Funktion hat, muss diese Funktion explizit auf dem __autoload-Stack registriert werden. Dies liegt daran, dass spl_autoload_register() den Engine-Cache für die __autoload-Funktion entweder durch spl_autoload() oder spl_autoload_call() ersetzt. Dies ist der Manpage – Ololo

0

Sie könnten Zend_Loader verwenden. (Angenommen, das Zend Framework ist für Sie verfügbar ...)

6

Sie können spl_autoload_register() verwenden, indem Sie alle vorhandenen __autoload() Magic zum Stack hinzufügen.

function my_autoload($class) {  
    include($class . '.al.php'); 
} 
spl_autoload_register('my_autoload'); 

if(function_exists('__autoload')) { 
    spl_autoload_register('__autoload'); 
}                       

$f = new Foo; 
4

Der richtige Weg wäre spl_autoload_register zu verwenden. So speichern Sie eine __autoload Funktion, die einige 3rd-Party eingeführt Sie auch diese Funktion auf dem Autoloader-Stack setzen können:

if (function_exists('__autoload')) { 
    spl_autoload_register('__autoload'); 
} 
0

Am besten können Sie Ihr eigenes Objekt definieren, das für das Autoloading für jedes Subsystem verantwortlich ist, das Sie programmieren.

Zum Beispiel:

class BasketAutoloader 
{ 
    static public function register() 
    { 
    spl_autoload_register(array(new self, 'autoload')); 
    } 

    public function autoload($class) 
    { 
    require dirname(__FILE__).'/'.$class.'.php'; 
    } 
}