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
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
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
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
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Przetestuj stworzoną przeze mnie funkcję automatycznego ładowania.
Wymyśl własną regułę automatycznego ładowania i zaimplementuj ją.