2010-04-13 23 views
7

He leído acerca dinámicamente la carga de los archivos de clase cuando sea necesario en una función como esta:¿Reemplazo de la función __autoload de PHP?

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

$obj = new DB(); 

que cargará automáticamente DB.class.php cuando se hace una nueva instancia de esa clase, pero también he leído en algunos artículos que es malo usar esto ya que es una función global y cualquier biblioteca que traigas a tu proyecto que tenga una función __autoload() la estropeará.

¿Alguien sabe de una solución? ¿Quizás otra forma de lograr el mismo efecto que __autoload()? Hasta que encuentre una solución adecuada, simplemente continuaré usando __autoload(), ya que no se convierte en un problema hasta que traiga bibliotecas y cosas así.

Gracias.

Respuesta

10

He utilizado el siguiente código para utilizar spl_autoload_register de una manera que se degradará si ISN 'presente, y también manejar bibliotecas que usan __autoload, que debe incluir.

//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; 
    } 

} 

Por lo tanto, ese código comprobará si hay una función __autoload existente y añadirlo a la pila, así como su propia (porque spl_autoload_register deshabilitará el comportamiento normal __autoload).

+0

Una buena solución, aunque haría la pequeña modificación de usar spl_autoload de todos modos, independientemente de la carga automática existente, simplemente cargue la función __autoload si existe, luego cargue su función. – Aatch

+0

Sí, puedes hacer eso, aunque si te entiendo correctamente, en realidad estás intercambiando las afirmaciones realmente con eso. – Kazar

3

Utilice spl_autoload_register en lugar de __autoload. Esto le permitirá agregar su función de autocarga en la pila.

+0

Creo 'spl_autoload_register' clobbers cualquier existente' __autoload' función, por lo que si una biblioteca lo utiliza, usted está acabando con la función de la biblioteca. Habiendo dicho eso, si dos bibliotecas definen una función '__autoload' ¡estás un poco atornillado de todos modos! –

+0

Si su código tiene una función __autoload existente, entonces esta función debe registrarse explícitamente en la pila __autoload. Esto se debe a que spl_autoload_register() reemplazará efectivamente el caché del motor para la función __autoload por spl_autoload() o spl_autoload_call(). Esto está tomado de la página de manual – Ololo

0

Puede usar Zend_Loader. (Suponiendo que Zend Framework está disponible para usted ...)

6

Puede usar spl_autoload_register(), agregando cualquier magia existente __autoload() a la pila.

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

La forma correcta sería usar spl_autoload_register. Para guardar una función __autoload que algún tercero-partido introdujo puedes poner esa función en el cargador automático-pila, así:

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

Lo mejor que puede hacer es definir su propio objeto responsable de cargar automáticamente cualquier subsistema que esté programando.

Por ejemplo:

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

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