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
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
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
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
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Testați funcția de autoloading creată de mine.
Gândiți-vă la propria regulă de autoloading și implementați-o.