Mulți programatori care scriu aplicații orientate pe obiecte crează câte un fișier PHP pentru fiecare clasă pe care o definesc. O problemă delicată era lista mare de fișiere ce trebuiau incluse la începutul fiecărui script.
În PHP 5, acest lucru nu mai este necesar. Se poate defini funcția __autoload() care este apelată automat în cazul în care doriți să folosiți o clasă care nu a fost încă definită. Apelul la această funcție oferă script-ului o ultimă șansă de a defini clasa pentru a nu termina cu eroare.
spl_autoload_register() oferă o alternativă mai flexibilă pentru autoîncărcarea claselor. Din acest motiv utilizarea __autoload() nu este recomandată și poate fi dezaprobată sau eliminată în viitor.
Notă:
Excepțiile aruncate în __autoload nu pot fi captate într-un bloc catch rezultând astfel o eroare fatală. Din 5.3.0+ excepțiile aruncate in funcția __autoload pot fi captate într-un bloc catch, cu o mică excepție. Dacă folosiți o excepție personalizată, atunci clasa respectiva trebuie să fie deja încărcată. Funcția __autoload poate fi folosită pentru a încărca recursiv excepția personalizată.
Notă:
Această funcție specială nu este disponibilă dacă folosiți PHP în mod CLI interactiv.
Notă:
Dacă denumirea clasei este utilizată de ex. în call_user_func(), atunci ea poate conține caractere periculoase, cum ar fi ../. Nu este recomandat să utilizați datele introduse de utilizator în asemenea funcții, sau, cel puțin, să verificați ce s-a introdus în __autoload().
Example #1 Exemplu cu autoîncărcare
Acest exemplu încearcă să încarce clasele MyClass1 și MyClass2 din fișierele MyClass1.php și MyClass2.php.
<?php
function __autoload($class_name) {
include $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
Example #2 Un alt exemplu Autoload
Acest exemplu încearcă să încarce interfața ITest.
<?php
function __autoload($name) {
var_dump($name);
}
class Foo implements ITest {
}
/*
string(5) "ITest"
Fatal error: Interface 'ITest' not found in ...
*/
?>
Example #3 Autoîncărcarea cu tratarea excepțiilor pentru 5.3.0+
Acest exemplu aruncă o excepție și demonstrează cum se captează cu try/catch.
<?php
function __autoload($name) {
echo "Vreau sa încarc $name.\n";
throw new Exception("Nu pot încărca $name.");
}
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
Exemplul de mai sus va afișa:
Vreau sa încarc NonLoadableClass. Nu pot încărca NonLoadableClass.
Example #4 Autoîncărcarea cu tratarea excepțiilor pentru 5.3.0+ - Fără excepție personalizată
Acest exemplu atuncă o excepție personalizată care nu a fost încărcată încă.
<?php
function __autoload($name) {
echo "Vreau să încarc $name.\n";
throw new MissingException("Nu pot încărca $name.");
}
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
Exemplul de mai sus va afișa:
Vreau să încarc NonLoadableClass. Nu pot încărca MissingException. Fatal error: Class 'MissingException' not found in testMissingException.php on line 4