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<?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<?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<?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<?php
  spl_autoload_register(function($class) {
    $root = $_SERVER['DOCUMENT_ROOT'];
    $ds = DIRECTORY_SEPARATOR;
    
    $filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
    require($filename);
  });
?>
Задание 1

Men yaratgan avtomatik yuklash funksiyasini sinab ko'ring.

Задание 2

O'zingizning avtomatik yuklash qoidangizni o'ylab toping va uni amalga oshiring.