Clase și Obiecte
PHP Manual

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. 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.

Sfat

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

Vedeți de asemenea


Clase și Obiecte
PHP Manual