Autoîncărcarea claselor

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.

Sfat

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