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 include para cada classe necessária).
Com PHP 5 isso não é mais necessário. Você pode definir uma função __autoload() que é automaticamente chamada no caso de você tentar usar uma classe/interface que ainda não foi definida. Ao chamar essa função o 'scripting engine' tem uma última chance para carregar a classe antes que o PHP falhe com erro.
spl_autoload_register() fornece uma alternativa mais flexível para 'autoloading' de classes. Por esta razão, o uso da função __autoload() é desencorajado e pode estar obsoleto ou ser removido no futuro.
Nota:
Antes do PHP 5.3.0 exceções disparadas na função __autoload não podiam ser pegas no bloco catch e resultavam em um erro fatal. De PHP 5.3.0 em diante exceções disparadas na função __autoload podem ser pegas no bloco catch, com uma condição. Se disparada uma exceção customizada, então a classe da exceção customizada deve estar 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
Essse exemplo tenta carregar as classes MyClass1 e MyClass2 dos arquivos MyClass1.php e MyClass2.php respectivamente.
<?php
function __autoload($class_name) {
require_once $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
Exemplo #2 Outro exemplo de Autoload
Este exemplo tenta carregar a interface ITest.
<?php
function __autoload($name) {
var_dump($name);
}
class Foo implements ITest {
}
/*
string(5) "ITest"
Fatal error: Interface 'ITest' not found in ...
*/
?>
Exemplo #3 Autoloading with exception handling for 5.3.0+
This example throws an exception and demonstrates the try/catch block.
<?php
function __autoload($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 Autoloading com manipulação de exceção para 5.3.0+ - Faltando exceção customizada.
Este exemplo dispara uma exceção para uma exceção customizada não carregável.
<?php
function __autoload($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