Własna funkcja automatycznego ładowania klas w OOP w PHP

Często domyślny automatyczny ładowacz może ci nie odpowiadać z jakichś powodów. W takim przypadku możesz napisać własny automatyczny ładowacz.

Aby to zrobić, do funkcji spl_autoload_register należy przekazać jako pierwszy parametr napisaną przez ciebie funkcję zwrotną (callback). Ta funkcja będzie wywoływana, gdy PHP wykryje odwołanie do niezaładowanej klasy. Do parametru tej funkcji będzie trafiać nazwa klasy wraz z przestrzenią nazw:

php<?php
  spl_autoload_register(function($class) {
    // w zmiennej $class będzie nazwa klasy z przestrzenią nazw
  });
?>

A obowiązkiem funkcji będzie, na podstawie nazwy klasy, załadowanie tej klasy za pomocą require. To znaczy, że wewnątrz tej funkcji musimy zapisać naszą własną regułę ładowania klas, czyli naszą własną konwencję nazewnictwa.

Napiszmy przykład jakiegoś własnego automatycznego ładowania. Niech, na przykład, ustalimy, że ścieżka do pliku klasy od katalogu głównego serwera będzie taka sama, jak przestrzeń nazw, ale z zachowaniem wielkości liter.

To znaczy, jeśli mamy klasę Core\Admin\PageController, to ścieżka do niej powinna być Core/Admin/PageController.php.

Jak widzisz, aby przekształcić nazwę klasy z jej przestrzenią nazw, trzeba po prostu zamienić odwrotne ukośniki na proste, a do nazwy klasy dodać .php. Zróbmy to:

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

Otrzymamy jednak względną ścieżkę do pliku (względem katalogu głównego serwera). Lepiej zrobić ścieżkę bezwzględną, w ten sposób:

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

Jest jeszcze jeden niuans. W różnych systemach operacyjnych ścieżka pomiędzy folderami może używać ukośnika prostego lub odwrotnego. Uczyńmy nasz kod niezależnym od systemu operacyjnego. W tym celu zamiast ukośnika prostego do oddzielania ścieżek użyjmy stałej DIRECTORY_SEPARATOR, zawierającej prawidłowy ukośnik dla systemu operacyjnego, w którym aktualnie uruchamiany jest nasz skrypt. Ostatecznie otrzymamy następujący kod:

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

Przetestuj stworzoną przeze mnie funkcję automatycznego ładowania.

Задание 2

Wymyśl własną regułę automatycznego ładowania i zaimplementuj ją.