7 de abril de 2015

Autocarga de clases __autoload() PHP

Cuando se escriben aplicaciones orientadas a objetos en PHP los archivos con las clases generalmente van dentro de una carpeta especifica, de esto saca ventaja la función __autoload para crear instancias de esas clases, __autoload no es una función definida en PHP, __autoload es una función que debemos definir y ésta será ejecutada cuando se instancie una clase. Entonces si nosotros almacenamos todas nuestras clases dentro de una carpeta clases podremos instanciar la clase sin necesidad de incluir el archivo que contenga la definición de la clase. Obviamente si el archivo no está incluido producirá un error. Un ejemplo muy común es definir el autoload y que este incluya el archivo fuente donde este la definición de la clase.
<?php
//index.php
function __autoload($fileName){
    $file = 'clases/' . $fileName.'.php';
    if (file_exists($file)){
        require_once $file;
    }
else {
        throw new Exception("Unable to load $class_name.");
    }
}

try {
$nuevo = new nuevo;
} catch (Exception $e) {
    echo $e->getMessage(), "\n";
} 
?>
La clase esta definida en la ruta clases/nuevo.php la cual se especifica en la función __autoload()
<?php
class nuevo{
    function __construct(){
        echo "Clase 'nuevo' ha sido instanciada";
    }
}
?>
En este ejemplo es importante que tanto el nombre del archivo como el nombre de la definición de la clase sean los mismos para que no produzcan un error. Cuando hago un new nuevo;, antes de hacer efectiva la instancia se ejecuta la función __autoload (debido a que esta definida) y llega como parametro el string nuevo;. La función concatena strings ($file = ‘clases/’ . $fileName.’.php’;) y forma el path clases/nuevo.php, luego pregunta si el archivo existe y si la pregunta es afirmativa termina incluyéndolo. Entonces sin necesidad de incluir el archivo estamos haciendo la instancia de la clase que deseábamos. Otra de las ventajas de usar autoload es que solamente vamos a incluir los archivos que son necesarios para nosotros. Muchas aplicaciones incluyen “kilos” de código innecesariamente sobrecargando la memoria sin sentido