Vlastní funkce pro automatické načítání tříd v OOP v PHP
Často vás standardní automatické načítání nemusí z různých důvodů vyhovovat. V takovém případě si můžete napsat vlastní automatické načítání.
K tomu je potřeba předat vaši napsanou
funkci-callback jako první parametr funkci spl_autoload_register.
Tato funkce bude volána, když PHP detekuje přístup k
nenatčené třídě. Parametr této funkce
bude obsahovat název třídy s namespacem:
<?php
spl_autoload_register(function($class) {
// v proměnné $class bude název třídy s namespacem
});
?>
A úkolem funkce je na základě názvu třídy
provést načtení této třídy pomocí require.
To znamená, že uvnitř této funkce musíme nastavit
vlastní pravidlo pro načítání tříd, tedy
vlastní konvenci pojmenování.
Pojďme napsat příklad nějakého vlastního automatického načítání. Řekněme například, že cesta k souboru třídy od kořene webu bude stejná jako namespace, ale s zachováním velikosti písmen.
To znamená, že pokud máme třídu Core\Admin\PageController,
tak cesta k ní by měla být Core/Admin/PageController.php.
Jak vidíte, pro transformaci názvu třídy
s jejím namespace stačí změnit
obrácená lomítka na přímá, a k názvu třídy
přidat .php. Udělejme to:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Dostaneme však relativní cestu k souboru (vzhledem ke kořeni webu). Lepší je udělat absolutní cestu, takto:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Existuje ještě jeden nuance. V různých operačních systémech
může být cesta přes složky s přímým lomítkem
nebo s obráceným. Udělejme náš kód nezávislý
na operačním systému. K tomu místo
přímého lomítka pro oddělování cest budeme
používat konstantu DIRECTORY_SEPARATOR,
obsahující správné lomítko pro operační systém,
ve kterém je právě spouštěn náš
skript. Nakonec dostaneme následující kód:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Otestujte mou vytvořenou funkci automatického načítání.
Vymyslete své vlastní pravidlo automatického načítání a implementujte jej.