Savo funkcija klasių automatiniam įkėlimui OOP PHP
Dažnai numatytasis automatinis įkėlimas gali jūsų netenkinti dėl įvairių priežasčių. Tokiu atveju galite parašyti savo automatinio įkėlimo funkciją.
Norint tai padaryti, į funkciją spl_autoload_register
pirmuoju parametru reikia perduoti jūsų parašytą
atgalinio kvietimo funkciją. Ši funkcija bus iškviečiama,
kai PHP aptiks kreipimąsi į
neįkeltą klasę. Į šios funkcijos parametrą
bus paduodamas klasės pavadinimas su vardų erdve:
<?php
spl_autoload_register(function($class) {
// kintamajame $class bus klasės pavadinimas su vardų erdve
});
?>
O funkcijos pareiga bus pagal klasės pavadinimą
atlikti šios klasės įkėlimą naudojant require.
Tai yra, šios funkcijos viduje mes turime nurodyti
savą taisyklę klasių įkėlimui, tai yra
savą pavadinimų susitarimą.
Parašykime kokios nors savos automatinio įkėlimo funkcijos pavyzdį. Tarkime, pavyzdžiui, kad mes sakome, kad kelias iki klasės failo nuo svetainės šaknies bus toks pats kaip ir vardų erdvė, bet išlaant simbolių registrą.
Tai yra, jei mes turime klasę Core\Admin\PageController,
tai kelias iki jos turi būti Core/Admin/PageController.php.
Kaip matote, norint paversti klasės pavadinimą
su jos vardų erdve reikia tiesiog pakeisti
atvirkščius pasviruosius brūkšnius į įprastus,
o prie klasės pavadinimo
pridėti .php. Padarykime tai:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Tačiau mes gausime santykinį kelią iki failo (nuo svetainės šaknies). Geriau padaryti absoliutų kelią, štai taip:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Yra dar vienas niuansas. Skirtingose operacinėse sistemose
kelias per aplankus gali būti su įprastu pasviruoju brūkšniu
arba su atvirkščiu. Padarykime mūsų kodą nepriklausomą
nuo operacinės sistemos. Norėdami tai padaryti, vietoj
įprasto pasvirojo brūkšnio kelių atskyrimui naudosime
konstantą DIRECTORY_SEPARATOR,
kuriame yra teisingas tos operacinės
sistemos pasvirasis brūkšnys, kurioje šiuo metu paleidžiamas mūsų
scenarijus. Galų gale gausime tokį kodą:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Ištestuokite sukurtą automatinio įkėlimo funkciją.
Sugalvokite savo automatinio įkėlimo taisyklę ir ją implementuokite.