Funcția ta personală pentru autoloadingul claselor în OOP în PHP

Deseori, funcția implicită de autoloading poate să nu vă convină din anumite motive. În acest caz, vă puteți scrie propriul autoloading.

Pentru aceasta, în funcția spl_autoload_register trebuie să transmiteți ca prim parametru o funcție-callback scrisă de dvs. Această funcție va fi apelată când PHP detectează accesarea unei clase care nu este încărcată. În parametrul acestei funcții va fi transmis numele clasei cu namespace-ul:

php<?php
  spl_autoload_register(function($class) {
    // în variabila $class va fi numele clasei cu namespace-ul
  });
?>

Iar responsabilitatea funcției este să încarce acea clasă prin require, pe baza numelui clasei. Adică, în interiorul acestei funcții, trebuie să specificăm propria noastră regulă pentru încărcarea claselor, adică propria noastră convenție de denumire.

Să scriem un exemplu de autoloading personal. Să presupunem, de exemplu, că stabilim că calea către fișierul clasei de la rădăcina site-ului va fi aceeași cu namespace-ul, dar cu păstrarea registrului literelor.

Adică, dacă avem clasa Core\Admin\PageController, atunci calea către ea ar trebui să fie Core/Admin/PageController.php.

După cum vedeți, pentru a transforma numele clasei cu namespace-ul său, trebuie doar să înlocuim backslash-urile cu slash-uri, iar la numele clasei să adăugăm .php. Să facem asta:

php<?php
  spl_autoload_register(function($class) {
    $filename = str_replace('\\', '/', $class) . '.php';
    require($filename);
  });
?>

Totuși, vom obține o cale relativă către fișier (relativă la rădăcina site-ului). Este mai bine să facem calea absolută, astfel:

php<?php
  spl_autoload_register(function($class) {
    $root = $_SERVER['DOCUMENT_ROOT'];
    $filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
    require($filename);
  });
?>

Mai există o nuanță. În diferite sisteme de operare calea prin directoare poate fi cu slash direct sau cu backslash. Să facem codul nostru independent de sistemul de operare. Pentru aceasta, în loc de slash direct pentru separarea căilor, vom folosi constanta DIRECTORY_SEPARATOR, care conține slash-ul corect pentru sistemul de operare în care rulează scriptul nostru. În final, obținem următorul cod:

php<?php
  spl_autoload_register(function($class) {
    $root = $_SERVER['DOCUMENT_ROOT'];
    $ds = DIRECTORY_SEPARATOR;
    
    $filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
    require($filename);
  });
?>
Задание 1

Testați funcția de autoloading creată de mine.

Задание 2

Gândiți-vă la propria regulă de autoloading și implementați-o.