PHP OOP-де класстерді автоожалу үшін өз функцияңыз
Көбінесе әдепкі автоожалу сізді қандай да бір себептермен қанағаттандырмауы мүмкін. Мұндай жағдайда өз автоожалуыңызды жазуға болады.
Ол үшін spl_autoload_register функциясына
бірінші параметр ретінде сіз жазылған
коллбэк-функцияны беру керек. Бұл функция
PHP бағдарламалау тілі жүктелмеген класқа
сілтеме анықтаған кезде шақырылады. Бұл функцияның
параметріне кеңістік атаулары бар класс аты енеді:
<?php
spl_autoload_register(function($class) {
// $class айнымалысында кеңістік атаулары бар класс аты болады
});
?>
Ал функцияның міндеті - класс аты бойынша
бұл класты require арқылы жүктеу.
Яғни бұл функцияның ішінде біз классстарды
жүктеу үшін өз ережемізді, яғни өз атау
екелігімізді жазуымыз керек.
Келіңіздер, өз автоожалуымыздың мысалын жазайық. Мысалы, біз айтайык, сайт түбірінен класс файлына дейінгі жол кеңістік атауы сияқты болады, бірақ таңбалар регистрін сақтайды.
Яғни, егер бізде Core\Admin\PageController класы болса,
онда оған дейінгі жол Core/Admin/PageController.php болуы керек.
Көріп отырғаныңыздай, класс атын оның кеңістік
атауымен түрлендіру үшін кері көлбеу сызықтарды
тікелейге ауыстырып, класс атына
.php қосу керек. Мұны істейік:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Алайда, бізде файлға дейінгі салыстырмалы жол шығады (сайт түбіріне қатысты). Абсолютті жолды жасаған дұрыс, мынадай:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Тағы бір нюанс бар. Түрлі операциялық жүйелерде
paperak бойынша жол тікелей көлбеу сызықпен
немесе кері көлбеу сызықпен болуы мүмкін.
Біздің кодты операциялық жүйеден тәуелсіз етейік.
Ол үшін paperak бөлу үшін тікелей көлбеу сызықтың орнына
DIRECTORY_SEPARATOR тұрақтысын қоямыз,
ол қазір скрипті іске қосып тұрған операциялық
жүйенің дұрыс көлбеу сызығын қамтиды. Нәтижеде келесі код шығады:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Мен жасаған автоожалу функциясын сынап көріңіз.
Өз автоожалу ережеңізді ойлап тауып, оны жүзеге асырыңыз.