Clases y Objetos
PHP Manual

Auto-carga de Clases

Muchos desarrolladores que escriben aplicaciones orientadas a objetos crean un archivo 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 más necesario. Se puede definir una función __autoload() la cual es automáticamente invocada en caso de que esté intentando utilizar una clase/interfaz que todavía no haya sido definida. Al invocar a esta función el motor de scripting está dando una última oportunidad de 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 ser obsoleta o 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 eso 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 1 disposición. Si se lanza una excepción personalizada, entonces la clase de excepción personalizada debe estar disponible. La función __autoload puede ser usada recursivamente para auto-cargar la clase de excepción personalizada.

Nota:

La auto-carga no está disponible si utiliza PHP en modo interactivo CLI.

Nota:

Si el nombre de la clase es usado, por ejemplo, en call_user_func() entonces puede contener algunos caracteres peligrosos tal como ../. Se recomienda no utilizar la entrada del usuario en tales funciones o al menos verifique dicha entrada en __autoload().

Ejemplo #1 Ejemplo de auto-carga

Este ejemplo intenta cargar las clases MyClass1 y MyClass2 de los archivos MyClass1.php y MyClass2.php respectivamente.

<?php
function __autoload($class_name) {
    include 
$class_name '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2();
?>

Ejemplo #2 Otro ejemplo de auto-carga

Este ejemplo intenta cargar la interfaz ITest.

<?php

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

class 
Foo implements ITest {
}

/*
string(5) "ITest"

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

Ejemplo #3 Auto-carga con manejo de excepciones para 5.3.0+

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

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

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

El resultado del ejemplo sería:

Intentando cargar NonLoadableClass.
Imposible cargar NonLoadableClass.

Ejemplo #4 Auto-carga con manejo de excepciones para 5.3.0+ - Omitiendo excepción personalizada

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

<?php
function __autoload($name) {
    echo 
"Intentando cargar $name.\n";
    throw new 
MissingException("Imposible cargar $name.");
}

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

El resultado del ejemplo sería:

Intentando cargar NonLoadableClass.
Intentando cargar MissingException.

Fatal error: Class 'MissingException' not found in testMissingException.php on line 4

Ver también


Clases y Objetos
PHP Manual