Autocarga de Objetos en PHP

0
37

Siguiendo con el curso de Clases y Objetos con PHP, en esta segundo Post escribo sobre la autocarga de Clases con PHP.
Qué es?:
Al programar Oriendato a Objetos no vemos en la necesidad de crear un archivo por cada clase, esto es para mantener ordenado y podamos incluir solo los archivos que necesitamos para utilizar cada clase.
Pero al utilizar muchas clases en un proceso, tenemos que hacer include() de todos los archivos contededores de Clases. Para solucionar este problema en PHP5 solo se tiene que llamar a la funcion
__autoload($nombreClase). Esta funcion se ejecutara y detectara la Clase justo antes que PHP detecte el error.
Ejemplo de uso :

function __autoload($nombreClase)
{
require_once $nombreClase.'.php';
}
$miclase = new MiClase();
echo $miclase->getNombre();

Errores que tenemos que evitar :
Un error comun que podemos cometer es escribir el nombre del archivo diferente al de la clase.
Lo que debemos hacer es seguir el Standard y poner el nombre del archivo .php y el nombre de la clase identicos.
nombre de archivo: “MiClase.php”
nombre de clase : “MiClase”
Errores a solucionar :
Al querer capturar el error de autocarga por alguna razon y pasarla a una excepcion el catch() no sera posible de esta manera. Al no ser esto posible PHP detectara que ha ocurrido un error fatal.

try
{
$miclase = new MiClasse();
echo $miclase->getNombre();
}
catch(Exception $e)
{
echo $e->getMessage();
}

Resultado del error:
Warning: require_once(MyClasse.php) [function.require-once]: failed to open stream.
Fatal error: require_once() [function.require]: Failed opening required ‘MyClasse.php’
Evitando el error

  1. Primero verifiquemos que el nombre de la clase o interface existan:
  2. if(class_exists($nombreClase,false) || interface_exists($nombreClase,false))
    {
    return;
    }
  3. hacemos un control de excepcion con try catch, dentro incluimos la clase sin pintar errores, verificamos si la clase o la interfaz no existen e instanciamos Exception en caso la clase ni la interface existan.
    try
    {
    @require_once($nombreClase. '.php');
    if (!class_exists($nombreClase, false) || !interface_exists($nombreClase, false))
    {
     throw new Exception('Class ' . $nombreClase . ' no encontrada');
    }
    }
    catch (Exception $e)
    {
    echo $e->getMessage();
    }

La Funcion completa nos quedaria de esta manera:

function __autoload($class)
{
if (class_exists($class, false) || interface_exists($class, false))
{
 return;
}
try
{
 @require_once($class . '.php');
 if (!class_exists($class, false) || !interface_exists($class, false))
{
   throw new Exception('Class ' . $class . ' not found');
 }
}
catch (Exception $e)
{
 echo $e->getMessage();
}
}

Diseñar páginas Web.