PHP да ООП да класлар учун ўз функциянгизни автолойиҳалаш

Кўпинча, стандарт автолойиҳалаш сизни қониқтирмаслиги мумкин баъзи сабабларга кўра. Бундай ҳолларда ўз автолойиҳалашингизни яза оласиз.

Бунинг учун spl_autoload_register функциясига биринчи параметр сифатида сиз язган коллбэк-функцияни ўтказасиз. Бу функция ишга тушadi, қачон PHP юкланмаган классга мурожаатни аниқлаганида. Бу функциянинг параметрига исм фазоси билан класс номи тушади:

php<?php
  spl_autoload_register(function($class) {
    // $class ўзгарувчисида исм фазоси билан класс номи бўлади
  });
?>

Функциянинг вазифаси эса класс номи бўйича ушбу классни require орқали юклашни бажаришдир. Яъни биз бу функциянинг ичида класларни юклаш учун ўз қоидамизни, яъни ўз номлаш келишувимизни ёзишимиз керак.

Келинг, бирор ўз автолойиҳалашимизни ёзиб кўрамиз. Масалан, айтайлик, класс файлининг сайт илдизидан йўли ўхшаш бўлади исм фазосига, лекин белгилар регистрини сақлаб.

Яъни, агар бизда Core\Admin\PageController класси бўлса, унинг йўли Core/Admin/PageController.php бўлиши керак.

Кўриб turganingizdek, класс номини унинг фазоси билан ўзгартириш учун фақат \tарка варақа слешларни тўғри слешларга алмаштириш керак, класс номига esa \t.php қўшиш керак. Буни амалга оширамиз:

php<?php
  spl_autoload_register(function($class) {
    $filename = str_replace('\\', '/', $class) . '.php';
    require($filename);
  });
?>

\tБирок, бизда файлга нисбий йўл hosil boʻladi \t(сайт илдизига нисбатан). Яхшироғи \tмутлақ йўлни ясаш, мана бу йўл билан:

php<?php
  spl_autoload_register(function($class) {
    $root = $_SERVER['DOCUMENT_ROOT'];
    $filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
    require($filename);
  });
?>

\tЯна бир нуқса бор. Турли операцион тизимларда \tпапкалар бўйича йўл тўғри слеш билан \tбўлиши мумкин ва яна тескари слеш билан. Келинг, бизнинг кодимизни операцион тизимдан mustaqil qilaylik. Бунинг учун \tйўлларни ажратиш учун тўғри слеш ўрнига \tконстанта DIRECTORY_SEPARATOR дан foydalanamiz, \tу ўз ичига олади ҳозир ишлаётган операцион \tтизимимиз учун тўғри слешни. Якунда 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

\t\tМен яратган автолойиҳалаш функциясини sinab koʻring.

Задание 2

\t\tЎз автолойиҳалаш қоидангизни oʻylab toping \t\tва уни амалга оширинг.