Ce face spl_autoload_register
Fără autoloader, fiecare fișier trebuie să facă require pentru toate clasele pe care le folosește. Cu spl_autoload_register dai o funcție care primește numele clasei și încarcă fișierul potrivit. PHP o apelează singur, doar când clasa este folosită prima dată.
De obicei, numele namespace-ului corespunde directoarelor: clasa App\Modele\Produs stă în src/Modele/Produs.php. Această regulă se numește PSR-4 și este folosită de Composer, care generează autoloader-ul în vendor/autoload.php.
Poți înregistra mai multe autoloadere; PHP le încearcă în ordine până când clasa apare.
Parametri
| Parametru | Descriere |
|---|---|
$callback |
Funcția care primește numele complet al clasei și încarcă fișierul ei. |
$throw |
Opțional. Parametru păstrat pentru compatibilitate; din PHP 8 este ignorat. |
$prepend |
Opțional. true pune autoloader-ul primul în listă. |
Ce returnează
true la succes.
Exemple
Exemplul 1: Autoloader simplu, după namespace
Exemplul creează întâi fișierul clasei, apoi îl lasă pe autoloader să îl încarce. Observă că autoloader-ul rulează o singură dată, deși creăm două obiecte.
<?php
@mkdir("src/Modele", 0777, true);
file_put_contents("src/Modele/Produs.php", '<?php
namespace App\Modele;
class Produs { public function __construct(public string $nume) {} }');
spl_autoload_register(function (string $clasa) {
echo "Autoloader: caut $clasa\n";
$prefix = "App\\";
if (!str_starts_with($clasa, $prefix)) {
return;
}
$fisier = __DIR__ . "/src/" . str_replace("\\", "/", substr($clasa, strlen($prefix))) . ".php";
if (is_file($fisier)) {
require $fisier;
}
});
$p = new App\Modele\Produs("Laptop");
$q = new App\Modele\Produs("Mouse");
echo $p->nume . " și " . $q->nume;
Rezultat
Autoloader: caut App\Modele\Produs
Laptop și Mouse
Exemplul 2: Clasă care nu poate fi găsită
class_exists pornește autoloader-ul doar la primul apel. Cu al doilea parametru false, autoloader-ul nu mai este apelat.
<?php
spl_autoload_register(function (string $clasa) {
echo "Nu am găsit fișier pentru $clasa\n";
});
var_dump(class_exists("Factura"));
var_dump(class_exists("Factura", false));
Rezultat
Nu am găsit fișier pentru Factura
bool(false)
bool(false)
Greșeli frecvente
- Faci
requirefără să verifici că fișierul există. Pentru o clasă inexistentă primești eroare fatală în loc de un mesaj clar. Verifică cuis_file. - Folosești deja Composer și scrii propriul autoloader. Adaugă regula în secțiunea
autoloaddincomposer.jsonși ruleazăcomposer dump-autoload.
Comenzi înrudite
namespace / use: Grupează clasele și funcțiile sub un nume comun, ca să nu se ciocnească cu altele care au același nume.class_exists / interface_exists / enum_exists: Verifică dacă o clasă (class_exists), o interfață sau un enum a fost definit.require / include: Încarcă și rulează codul dintr-un alt fișier PHP.