Autocarga de clases

Muchos desarrolladores que escriben aplicaciones orientadas a objetos crean un fichero fuente de PHP para cada definición de clase. Una de las mayores molestias es tener que hacer una larga lista de inclusiones al comienzo de cada script (uno por cada clase).

En PHP 5 esto ya no es necesario. La función spl_autoload_register() registra cualquier número de autocargadores, posibilitando que las clases e interfaces sean cargadas automáticamente si no están definidas actualmente. Al registrar autocargadores, a PHP se le da una última oportunidad de cargar las clases o interfaces antes de que falle por un error.

Sugerencia

Aunque la función __autoload() también puede ser empleada para autocargar clases e interfaces, es preferible utilizar la función spl_autoload_register(). Esto es debido a que es una alternativa más flexible (posibilitando que se pueda especificar cualquier número de autocargadores en la aplicación, tales como los de las bibliotecas de terceros). Por esta razón, se desaconseja el uso de __autoload(), ya que podría estar obsoleta en el futuro.

Nota:

Antes de 5.3.0, las excepciones lanzadas en la función __autoload() no podían ser capturadas en el bloque catch, resultando en un error fatal. Desde 5.3 en adelante, esto es posible simpre que, si se lanza una excepción personalizada, esté disponible la clase de la excepción personalizada. La función __autoload() podría utilizarse recursivamente para cargar la clase de excepción personalizada.

Nota:

La autocarga no está disponible si se utiliza PHP en el modo interactivo CLI.

Nota:

Si el nombre de la clase se utiliza, por ejemplo, en call_user_func(), este puede contener algunos caracteres peligrosos tales como ../. Se recomienda no utilizar la entrada del usuario en tales funciones, o al menos verificar dicha entrada en __autoload().

Ejemplo #1 Ejemplo de autocarga

Este ejemplo intenta cargar las clases MiClase1 y MiClase2 desde los ficheros MiClase1.php y MiClase2.php, respectivamente.

<?php
spl_autoload_register
(function ($nombre_clase) {
    include 
$nombre_clase '.php';
});

$obj  = new MiClase1();
$obj2 = new MiClase2();
?>

Ejemplo #2 Otro ejemplo de autocarga

Este ejemplo intenta cargar la interfaz IPrueba.

<?php

spl_autoload_register
(function ($nombre) {
    
var_dump($nombre);
});

class 
Foo implements IPrueba {
}

/*
string(7) "IPrueba"

Fatal error: Interface 'IPrueba' not found in ...
*/
?>

Ejemplo #3 Autocarga con manejo de excepciones para 5.3.0+

Este ejemplo lanza una excepción y demuestra los bloques try/catch.

<?php
spl_autoload_register
(function ($nombre) {
    echo 
"Intentando cargar $nombre.\n";
    throw new 
Exception("Imposible cargar $nombre.");
});

try {
    
$obj = new ClaseNoCargable();
} catch (
Exception $e) {
    echo 
$e->getMessage(), "\n";
}
?>

El resultado del ejemplo sería:

Intentando cargar ClaseNoCargable.
Imposible cargar ClaseNoCargable.

Ejemplo #4 Autocarga con manejo de excepciones para 5.3.0+: Excepción personalizada ausente

Este ejemplo lanza una excepción para una excepción personalizada no cargable.

<?php
spl_autoload_register
(function ($nombre) {
    echo 
"Intentando cargar $nombre.\n";
    throw new 
ExcepciónAusente("Imposible cargar $nombre.");
});

try {
    
$obj = new ClaseNoCargable();
} catch (
Exception $e) {
    echo 
$e->getMessage(), "\n";
}
?>

El resultado del ejemplo sería:

Intentando cargar ClaseNoCargable.
Intentando cargar ExcepciónAusente.

Fatal error: Class 'ExcepciónAusente' not found in testExcepcionAusente.php on line 4