spl_autoload_register în PHP

Clase și obiecte PHP 5.1.2+

Înregistrează o funcție care încarcă automat fișierul unei clase prima dată când clasa este folosită.

Sintaxă
spl_autoload_register(?callable $callback = null, bool $throw = true, bool $prepend = false): bool

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 require fără să verifici că fișierul există. Pentru o clasă inexistentă primești eroare fatală în loc de un mesaj clar. Verifică cu is_file.
  • Folosești deja Composer și scrii propriul autoloader. Adaugă regula în secțiunea autoload din composer.json și rulează composer dump-autoload.

Comenzi înrudite