PHP OOPda Klasslar avtomatik yuklash uchun shaxsiy funksiya
Ko'pincha standart avtomatik yuklash sizni ba'zi sabablarga ko'ra qoniqtirmasligi mumkin. Bunday holatda o'zingizning avtomatik yuklash funksiyangizni yozishingiz mumkin.
Buning uchun spl_autoload_register funksiyasiga
birinchi parametr sifatida siz yozgan
callback funksiyani uzatish kerak. Bu funksiya chaqiriladi,
qachonki PHP yuklanmagan klassga murojaat qilganini
aniqlaganda. Ushbu funksiyaning parametriga
nomlar fazosi bilan klass nomi tushadi:
<?php
spl_autoload_register(function($class) {
// $class o'zgaruvchisida nomlar fazosi bilan klass nomi bo'ladi
});
?>
Funksiyaning vazifasi esa klass nomi bo'yicha
ushbu klassni require orqali yuklashni
bajarishdir. Ya'ni bu funksiya ichida biz
klasslarni yuklash uchun o'zimizning qoidamizni, ya'ni
o'zimizning nomlash kelishuvimizni belgilashimiz kerak.
Keling, o'zimizning avtomatik yuklashimizning misolini yozaylik. Masalan, faraz qilaylik, biz klass fayliga bo'lgan yo'l sayt ildizidan nomlar fazosi bilan bir xil bo'lishini, lekin belgilar registri saqlangan holda bo'lishini talab qilamiz.
Ya'ni, agar bizda Core\Admin\PageController klassi bo'lsa,
unga bo'lgan yo'l Core/Admin/PageController.php bo'lishi kerak.
Ko'rib turganingizdek, klass nomini uning
fazosi bilan o'zgartirish uchun shunchaki
teskari chiziqlarni to'g'ri chiziqlarga almashtirish,
klass nomiga esa .php qo'shish kerak. Buni amalga oshiramiz:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Biroq, bizda faylga nisbiy yo'l (sayt ildiziga nisbatan) hosil bo'ladi. Mutlaq yo'l qilish yaxshiroq, mana buni qanday qilish mumkin:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Yana bir nuans bor. Turli operatsion tizimlarda
papkalar bo'yicha yo'l
to'g'ri chiziqcha yoki teskari chiziqcha bilan bo'lishi mumkin. Keling, kodimizni
operatsion tizimdan mustaqil qilaylik. Buning uchun
yo'llarni ajratishda to'g'ri chiziqcha o'rniga
hozirda skriptimiz ishlayotgan operatsion
tizimning to'g'ri chiziqchasini o'z ichiga olgan DIRECTORY_SEPARATOR konstantasidan foydalanamiz.
Natijada quyidagi kodni olamiz:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Men yaratgan avtomatik yuklash funksiyasini sinab ko'ring.
O'zingizning avtomatik yuklash qoidangizni o'ylab toping va uni amalga oshiring.