Classes e Objetos
PHP Manual

Autoloading Classes

Muitos desenvolvedores ao desenvolver aplicações orientadas a objeto criam um arquivo PHP para cada definição de classe. Um dos maiores contratempos é ter de escrever uma longa lista de includes no início de cada script(um para cada classe).

No PHP 5 isso não é mais necessário. A função spl_autoload_register() registra qualquer número de autoloaders, permitindo que classes e interfaces sejam automaticamente carregadas se elas não ainda não foram definidas. Ao registrar autoloaders, o PHP têm uma última chance de carregar classes e interfaces antes que falhem com um erro.

Dica

Embora a função __autoload() também pode ser utilizada para carregar automaticamente classes e interfaces, é preferível a utilização da função spl_autoload_register(). Por que é uma alternativa mais flexível (permitindo que vários autoloaders sejam especificados na aplicação, assim como bibliotecas de terceiros). Por esta razão, o uso da função __autoload() é desencorajado e pode se tornar obsoleta em versões futuras.

Nota:

Antes do PHP 5.3.0 exceções disparadas na função __autoload() não eram capturadas no bloco catch e resultavam em um erro fatal. Do PHP 5.3.0 em diante, isso é possível sendo que se uma exceção customizada é disparada, então a classe da exceção customizada se tornará disponível. A função __autoload() deve ser usada recursivamente para carregar a classe de exceção customizada.

Nota:

Autoloading não é disponível usando PHP em modo interativo CLI.

Nota:

Se o nome da classe é usado por exemplo em call_user_func() então ela pode conter alguns caracteres perigosos como ../. É recomendado não usar entrada de usuário nestas funções ou pelo menos verificar a entrada em __autoload().

Exemplo #1 Exemplo de Autoload

Esse exemplo tenta carregar as classes MyClass1 e MyClass2 dos arquivos MyClass1.php e MyClass2.php respectivamente.

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

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

Exemplo #2 Outro exemplo de Autoload

Este exemplo tenta carregar a interface ITest.

<?php

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

class 
Foo implements ITest {
}

/*
string(5) "ITest"

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

Exemplo #3 Autoload com manipulação de exceções no PHP 5.3.0+

Este exemplo lançará uma exceção e demonstrará o bloco try/catch.

<?php
spl_autoload_register
(function ($name) {
    echo 
"Want to load $name.\n";
    throw new 
Exception("Unable to load $name.");
});

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

O exemplo acima irá imprimir:

Want to load NonLoadableClass.
Unable to load NonLoadableClass.

Exemplo #4 Autoload com manipulação de exceções no PHP 5.3.0+ - Faltando exceção customizada.

Este exemplo dispara uma exceção para uma exceção customizada não carregável.

<?php
spl_autoload_register
(function ($name) {
    echo 
"Want to load $name.\n";
    throw new 
MissingException("Unable to load $name.");
});

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

O exemplo acima irá imprimir:

Want to load NonLoadableClass.
Want to load MissingException.

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

Veja Também


Classes e Objetos
PHP Manual