Auto carga de objetos utilizando la función __autoload de PHP5
25/07/2008
Cuando desarrollamos con PHP sobre el paradigma Orientado Objetos, cada clase es definida en un script php. Por lo que para poder utilizar dichas clases, se deberán hacer los includes necesarios al principio de cada script. Dependiendo de la complejidad de la aplicación, puede terminar siendo, una larga y tediosa lista de includes.
En PHP5 esto se puede evitar. Sólo hay que definir una función llamada __autoload, la cual es llamada automáticamente en el caso de que se intente usar una clase que no haya sido incluida en el script. Es la última chance de cargar la clase antes de que PHP lance un error.
Otra de las ventajas de utilizar __autoload, es que evitamos se incluyan definiciones de clases que no utilizamos. Esto mejorará el rendimiento de nuestras aplicaciones ya que solo se cargan las clases que necesitamos. Por otro lado, se debe tener en cuenta de que la función __autoload será llamada recurrentemente, por lo que tendrá que ser definida lo más liviana posible.
<?php
function __autoload($className) {
if (file_exists("./lib/$className.class.php") ){
include_once("./lib/$className.class.php");
}
}
$instancia = new unaClase();
?>
En el caso de que estemos desarrollando una aplicación web o escribiendo código que puede ser utilizado por terceros, no es buena idea usar la función __autoload, dado que podría generar eventualmente un conflicto con otra función __autoload definida por terceros. Esto sucede porque lógicamente no puede haber dos funciones con el mismo nombre registradas. Lo que conviene es o bien declararla dentro de una clase o llamarla con otro nombre y luego registrarla en ambos casos mediante la función
spl_autoload_register<?php
spl_autoload_register(array('OP', '__autoload'));
class OP{
private static
$dir_class= array('util',
'controller',
'model',
'session',
'i18n');
public static function __autoload($class) {
foreach(self::$dir_class as $dir){
if(file_exists("./lib/$dir/$class.class.php")){
include_once("./lib/$dir/$class.class.php");
}
}
}
}
function miAutoload($class) {
include_once("./$class.php");
return true;
}
spl_autoload_register('miAutoload');
//Registramos otra vez la misma función
spl_autoload_register('miAutoload');
//Mostramos las funciones registradas
var_dump(spl_autoload_functions());
?>
Podremos ver que la función miAutoload esta registrada solo una vez.
array(2) { [0]=> array(2) { [0]=> string(2) "OP"
[1]=> string(8) "__autoload" }
[1]=> string(10) "miAutoload" }