sábado, 17 de agosto de 2013

PHP orientado a objetos - Función mágica de autocarga (__autoload)

En la parte1 y parte 2 del tutorial de métodos mágicos vimos métodos que se pueden definir en una clase y que serán llamados por PHP automáticamente dependiendo de la situación. Ahora vamos a ver una función mágica que se va a encargar de la autocarga de clases: __autoload().

La forma clásica de trabajar con programación orientada a objetos es la de definir una clase en cada script y hacer una inclusión de la misma en los scripts que necesiten hacer uso de ella. Pero si tenemos decenas de clases y tenemos que incluirlas múltiples de veces puede ser muy tedioso. Por eso en PHP 5 aparece la función mágica __autoload(). Que será llamada en el momento que se intente utilizar una clase o interfaz que todavía no ha sido definida mediante ninguna inclusión. Y mediante la definición de su lógica intentar incluirla. De esta forma se puede evitar que los desarrolladores tengan que definir una larga lista de 'includes' al principio de los scripts. Ya que estamos haciendo una carga dinámica.

La sintaxis para definir la función mágica __autoload es muy sencilla y solo tiene como único argumento a la variable que llevará al nombre de la clase que se está intentando cargar. Por ejemplo, si intentamos crear una instancia de la clase Ejemplo (new Ejemplo()) y está no ha sido incluida, antes de lanzar un error, PHP busca si se ha definido la función __autoload(). Como parámetro de esta se pasará 'Ejemplo'. Y se intentará cargar la clase mediante la lógica de esta función mágica. Si no es posible si que se lanzará un error.
Evidentemente dentro de la lógica de la función tendremos que tener en cuenta el directorio o directorios donde definimos las clases de la aplicación. Y si las clases que se han definido tienen todas un prefijo o no.

 function __autoload($nombre_clase) {  
   include $nombre_clase . '.php';  
 }  

 function __autoload($nombre_clase)   
 {  
   require_once './class/class.' . $nombre_clase. '.php';  
 }  

Autocarga y funciones estáticas

Una función estática implica llamar a la función sin tener que definir una instancia de la clase que la define. Simplemente utilizaremos el nombre de la clase. Por lo tanto la autocarga funciona de la misma forma que se ha comentado anteriormente.

 function __autoload($nombre_clase)   
 {  
   require_once './class/class.' . $nombre_clase . '.php';  
 }  
 ClaseBuscada::funcionEstatica($params);  

Excepciones

En versiones anteriores a PHP 5.3 no se permitía utilizar excepciones en la función mágica de autocarga ya que estas no podían ser capturadas por bloques 'catch'. En PHP 5.3 y superiores esto ya no ocurre y podemos utilizar las excepciones libremente. Por lo tanto podemos comprobar la existencia del fichero con la clase a cargar y si no lanzar una excepción. Vamos a ver un ejemplo:

 function __autoload($nombre_clase) {  
   if(file_exists('./class/' . $nombre_clase . '.php')) {  
     require_once('./class/' . $nombre_clase . '.php');    
   } else {  
     throw new Exception("Imposible de cargar la clase $class_name.");  
   }  
 }  
 try {  
   $a = new Test();  
   $b = new Test2();  
 } catch (Exception $e) {  
   echo $e->getMessage(), "\n";  
 }  


class_exists

La función class_exists sirve para comprobar si una clase existe mediante su nombre pasado como primer parámetro. Lo característico de esta función es que por defecto llama a la función __autoloader(). Pero gracias a su segundo parámetro podemos desactivar este comportamiento. Y de esta forma evitar posibles conflictos.

 bool class_exists ( string $class_name [, bool $autoload = true ] )  


Entradas relacionadas

PHP orientado a objetos - Métodos mágicos - Parte 1
PHP orientado a objetos - Métodos mágicos - Parte 2

No hay comentarios:

Publicar un comentario