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. Funcția spl_autoload_register() înregistrează orice număr de autoîncărcătoare, permițând claselor și interfețelor să fie încărcate automat în caz că nu sunt încă definite. Înregistrând autoîncărcătoarele, PHP i se oferă o ultimă șansă de a încărca clasa sau interfața înainte de a eșua cu eroare.
Cu toate că și funcția __autoload() poate fi utilizată pentru autoîncărcarea claselor și interfețelor, este preferabilă utilizarea funcției spl_autoload_register(). Aceasta reprezintă o alternativă mai flexibilă (permițând specificarea în aplicație a oricărui număr de autoîncărcătoare, ca de exemplu în biblioteci ale terților). Din acest motiv utilizarea __autoload() nu este recomandată și poate fi considerată învechită sau chiar eliminată în viitor.
Notă:
Înainte de PHP 5.3, excepțiile aruncate în funția __autoload() nu puteau fi captate într-un bloc catch rezultând astfel o eroare fatală. Începând cu PHP 5.3 aceasta este posibil dacă clasa unei excepții personalizate este definită la momentul generării excepției personalizate. Funcția __autoload() poate fi folosită pentru a încărca recursiv clasa excepției personalizate.
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
spl_autoload_register(function ($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
spl_autoload_register(function ($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
spl_autoload_register(function ($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
spl_autoload_register(function ($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