Դասերի ինքնաբեռնման սեփական ֆունկցիան PHP-ի ՕՕՊ-ում

Հաճախ լռելյայն ինքնաբեռնումը կարող է ձեզ չբավարարել ինչ-ինչ պատճառներով: Այդ դեպքում կարող եք գրել ձեր սեփական ինքնաբեռնումը:

Դրա համար spl_autoload_register ֆունկցիային որպես առաջին պարամետր պետք է փոխանցել ձեր կողմից գրված ֆունկցիա-կոլբեքը: Այս ֆունկցիան կկանչվի, երբ PHP-ն հայտնաբերի դեռևս չբեռնված դասի հղում: Այս ֆունկցիայի պարամետրին կհասնի դասի անունը namespace-ով:

php<?php
  spl_autoload_register(function($class) {
    // $class փոփոխականում կլինի դասի անունը namespace-ով
  });
?>

Իսկ ֆունկցիայի պարտականությունը կլինի ըստ դասի անվան կատարել այդ դասի բեռնումը require-ի միջոցով: Այսինքն՝ այս ֆունկցիայի ներսում մենք պետք է գրենք դասերի բեռնման մեր սեփական կանոնը, այսինքն անվանման մեր սեփական համաձայնեցումը:

Եկեք գրենք մեր ինքնաբեռնման ինչ-որ օրինակ: Ենթադրենք, օրինակ, մենք ասում ենք, որ դասի ֆայլի ճանապարհը կայքի արմատից կլինի նույնը, ինչ namespace-ը, բայց սիմվոլների ռեգիստրը պահպանելով:

Այսինքն, եթե մենք ունենք Core\Admin\PageController դասը, ապա դրա ճանապարհը պետք է լինի Core/Admin/PageController.php:

Ինչպես տեսնում եք, դասի անունը նրա namespace-ով վերափոխելու համար պետք է պարզապես հակադարձ բութերիթները փոխարինել ուղիղներով, իսկ դասի անվանը ավելացնել .php: Եկեք դա անենք.

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

Սակայն մեզ մոտ կստացվի ֆայլի հարաբերական ճանապարհ (կայքի արմատի նկատմամբ): Ավելի լավ է կատարել բացարձակ ճանապարհ, ահա այսպես.

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

Կա ևս մեկ նրբերանգ: Տարբեր օպերացիոն համակարգերում պանակների միջով ճանապարհը կարող է լինել ուղիղ բութերիթով կամ հակադարձով: Եկեք մեր կոդը դարձնենք անկախ օպերացիոն համակարգից: Դրա համար ճանապարհները բաժանելու ուղիղ բութերիթի փոխարեն կդնենք DIRECTORY_SEPARATOR հաստատունը, որը պարունակում է ճիշտ բութերիթը այն օպերացիոն համակարգի, որում այս պահին գործարկվում է մեր սկրիպտը: Արդյունքում կստանանք հետևյալ կոդը.

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

Փորձարկեք իմ ստեղծած ինքնաբեռնման ֆունկցիան:

Задание 2

Հնարեք ձեր սեփական ինքնաբեռնման կանոնը և իրականացրեք այն: