Vlastná funkcia pre automatické načítanie tried v OOP v PHP
Často vás predvolené automatické načítanie nemusí uspokojiť z nejakých dôvodov. V takom prípade si môžete napísať vlastné automatické načítanie.
Na to je potrebné funkcii spl_autoload_register
ako prvý parameter odovzdať vašu napísanú
funkciu-spätné volanie. Táto funkcia sa bude volať,
keď PHP zistí prístup k
nenačítanej triede. Do parametra tejto funkcie
bude vstupovať názov triedy s menným priestorom:
<?php
spl_autoload_register(function($class) {
// v premennej $class bude názov triedy s menným priestorom
});
?>
A povinnosťou funkcie bude podľa názvu triedy
vykonať načítanie tejto triedy pomocou require.
To znamená, že vnútri tejto funkcie musíme napísať
naše pravidlo pre načítanie tried, teda
naše dohodnuté pomenovanie.
Napíšme príklad nejakého vlastného automatického načítania. Nech napríklad hovoríme, že cesta k súboru triedy od koreňa webu bude rovnaká, ako menný priestor, ale so zachovaním veľkosti písmen.
To znamená, že ak máme triedu Core\Admin\PageController,
tak cesta k nej by mala byť Core/Admin/PageController.php.
Ako vidíte, na transformáciu názvu triedy
s jej menným priestorom je potrebné jednoducho zmeniť
spätné lomky na priame, a k názvu triedy
pridať .php. Urobme to:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Nám sa však vytvorí relatívna cesta k súboru (vzhľadom na koreň webu). Lepšie je vytvoriť absolútnu cestu, takto:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Existuje ešte jeden nuans. V rôznych operačných systémoch
môže byť cesta cez priečinky s priamym lomkom
alebo so spätným lomkom. Urobme náš kód nezávislým
od operačného systému. Na to namiesto
priameho lomku na oddelenie ciest budeme
vkladať konštantu DIRECTORY_SEPARATOR,
obsahujúcu správny lomok toho operačného
systému, do ktorého sa práve spúšťa náš
skript. Nakoniec získame nasledujúci 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 si moju vytvorenú funkciu automatického načítania.
Vymyslite svoje vlastné pravidlo automatického načítania a implementujte ho.