PHP да ООП да класлар учун ўз функциянгизни автолойиҳалаш
Кўпинча, стандарт автолойиҳалаш сизни қониқтирмаслиги мумкин баъзи сабабларга кўра. Бундай ҳолларда ўз автолойиҳалашингизни яза оласиз.
Бунинг учун spl_autoload_register
функциясига биринчи параметр сифатида сиз язган
коллбэк-функцияни ўтказасиз. Бу функция ишга тушadi,
қачон PHP юкланмаган классга мурожаатни аниқлаганида.
Бу функциянинг параметрига исм фазоси билан класс номи тушади:
<?php
spl_autoload_register(function($class) {
// $class ўзгарувчисида исм фазоси билан класс номи бўлади
});
?>
Функциянинг вазифаси эса класс номи бўйича
ушбу классни require орқали юклашни бажаришдир.
Яъни биз бу функциянинг ичида класларни юклаш учун
ўз қоидамизни, яъни
ўз номлаш келишувимизни ёзишимиз керак.
Келинг, бирор ўз автолойиҳалашимизни ёзиб кўрамиз. Масалан, айтайлик, класс файлининг сайт илдизидан йўли ўхшаш бўлади исм фазосига, лекин белгилар регистрини сақлаб.
Яъни, агар бизда Core\Admin\PageController класси бўлса,
унинг йўли Core/Admin/PageController.php бўлиши керак.
Кўриб turganingizdek, класс номини унинг
фазоси билан ўзгартириш учун фақат
\tарка варақа слешларни тўғри слешларга алмаштириш керак, класс номига esa
\t.php қўшиш керак. Буни амалга оширамиз:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
\tБирок, бизда файлга нисбий йўл hosil boʻladi \t(сайт илдизига нисбатан). Яхшироғи \tмутлақ йўлни ясаш, мана бу йўл билан:
<?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
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
\t\tМен яратган автолойиҳалаш функциясини sinab koʻring.
\t\tЎз автолойиҳалаш қоидангизни oʻylab toping \t\tва уни амалга оширинг.