Clases y Objetos
PHP Manual

Autocarga de clases

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

En PHP 5 esto ya no es necesario. Se puede definir una función __autoload() que es automáticamente invocada en caso de que se esté intentando utilizar una clase/interfaz que todavía no haya sido definida. Al invocar a esta función el motor de scripting da una última oportunidad para cargar la clase antes que PHP falle con un error.

Sugerencia

spl_autoload_register() proporciona una alternativa más flexible para la carga automática de clases. Por esta razón, el uso de __autoload() no se recomienda y puede quedar obsoleta o ser eliminada 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 y resultaba en un error fatal. Desde 5.3.0+ las excepciones lanzadas en la función __autoload pueden ser capturadas en el bloque catch, con una consideración. Si se lanza una excepción personalizada, la clase de dicha excepción debe estar disponible. La función __autoload puede usarse recursivamente para autocargar la clase de la 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(), 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
function __autoload($nombre_clase) {
    include 
$nombre_clase '.php';
}

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

Ejemplo #2 Otro ejemplo de autocarga

Este ejemplo intenta cargar la interfaz ITest.

<?php

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

class 
Foo implements ITest {
}

/*
string(5) "ITest"

Fatal error: Interface 'ITest' 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
function __autoload($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
function __autoload($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

Ver también


Clases y Objetos
PHP Manual