PHPдегин ООПсинде класстарды өзүңүздүн автозагрузка функцияңыз
Көп учурда, демейки автозагрузка сизди кандайдыр бир себептер менен канааттандырбашы мүмкүн. Мындай учурда өзүңүздүн автозагрузкаңызды жаза аласыз.
Бул үчүн, spl_autoload_register функциясына
биринчи параметр катары сиз жазылган коллбэк-функцияны
берүүңүз керек. Бул функция PHP жүктөлө элек класска
кайрылганды байкаганда чакырылат. Бул функциянын
параметрине аталыш мейкиндиги менен кошо класс аты түшөт:
<?php
spl_autoload_register(function($class) {
// $class өзгөрмөсүндө аталыш мейкиндиги менен класс аты болот
});
?>
Функциянын милдети - класс аты боюнча, бул классты
require аркылуу жүктөө.
Башкача айтканда, бул функциянын ичинде биз
класстарды жүктөө үчүн өзүбүздүн эрежебизди,
демек, өзүбүздүн аталыш конвенциябызды жазышыбыз керек.
Келгиле, бир өзүбүздүн автозагрузкабыздын мисалын жазалы. Мисалы, биз айталы, класстын файлына чейинки жол сайттын тамырынан баштап, аталыш мейкиндиги менен бирдей болсун, бирок символдордун регистри сакталсын.
Демек, эгер бизде Core\Admin\PageController класcы болсо,
анда ага чейинки жол 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);
});
?>
Дагы бир нюанс бар. Ар кандай операциялык системдерде
папкалар боюнча жол алдыга карай кыл же артка карай кыл менен болушу мүмкүн.
Биздин кодубузду операциялык системадан көз карандысыз кылалы.
Бул үчүн, жолдорду бөлүү үчүн алдыга карай кылдын ордуна,
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);
});
?>
Менин түзгөн автозагрузка функциямды сынап көрүңүз.
Өзүңүздүн автозагрузка эрежеңизди ойлоп табыңыз жана аны ишке ашырыңыз.