Դասերի ինքնաբեռնման սեփական ֆունկցիան PHP-ի ՕՕՊ-ում
Հաճախ լռելյայն ինքնաբեռնումը կարող է ձեզ չբավարարել ինչ-ինչ պատճառներով: Այդ դեպքում կարող եք գրել ձեր սեփական ինքնաբեռնումը:
Դրա համար spl_autoload_register
ֆունկցիային որպես առաջին պարամետր պետք է փոխանցել
ձեր կողմից գրված ֆունկցիա-կոլբեքը: Այս ֆունկցիան կկանչվի,
երբ PHP-ն հայտնաբերի դեռևս չբեռնված դասի
հղում: Այս ֆունկցիայի պարամետրին
կհասնի դասի անունը namespace-ով:
<?php
spl_autoload_register(function($class) {
// $class փոփոխականում կլինի դասի անունը namespace-ով
});
?>
Իսկ ֆունկցիայի պարտականությունը կլինի ըստ դասի անվան
կատարել այդ դասի բեռնումը require-ի միջոցով:
Այսինքն՝ այս ֆունկցիայի ներսում մենք պետք է գրենք
դասերի բեռնման մեր սեփական կանոնը, այսինքն
անվանման մեր սեփական համաձայնեցումը:
Եկեք գրենք մեր ինքնաբեռնման ինչ-որ օրինակ: Ենթադրենք, օրինակ, մենք ասում ենք, որ դասի ֆայլի ճանապարհը կայքի արմատից կլինի նույնը, ինչ namespace-ը, բայց սիմվոլների ռեգիստրը պահպանելով:
Այսինքն, եթե մենք ունենք Core\Admin\PageController դասը,
ապա դրա ճանապարհը պետք է լինի Core/Admin/PageController.php:
Ինչպես տեսնում եք, դասի անունը նրա namespace-ով
վերափոխելու համար պետք է պարզապես հակադարձ բութերիթները
փոխարինել ուղիղներով, իսկ դասի անվանը
ավելացնել .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);
});
?>
Փորձարկեք իմ ստեղծած ինքնաբեռնման ֆունկցիան:
Հնարեք ձեր սեփական ինքնաբեռնման կանոնը և իրականացրեք այն: