လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> အလိုအလျောက်လူတန်းစားတင်ခြင်းကိုအကောင်အထည်ဖော်ရန် Init functions များနှင့် autoloader ကိုပေါင်းစပ်ခြင်း

အလိုအလျောက်လူတန်းစားတင်ခြင်းကိုအကောင်အထည်ဖော်ရန် Init functions များနှင့် autoloader ကိုပေါင်းစပ်ခြင်း

gitbox 2025-05-29

Autoloading သည် PHP တွင်အရေးကြီးသောအင်္ဂါရပ်တစ်ခုဖြစ်သည်။ ၎င်းသည်အတန်းအစားဖိုင်များ အပါအ 0 င် လူတန်းစား မပါဘဲလူတန်းစားကိုခေါ်ဆိုသည့်အခါ၎င်းသည်သက်ဆိုင်ရာအတန်းဖိုင်များကိုအလိုအလျောက်မိတ်ဆက်ပေးရန်ခွင့်ပြုသည်။ အလိုအလျောက်တင်ခြင်းကိုရရှိရန်အတွက် __Autoload () function သို့မဟုတ် spl_autoload_register () method ကိုသုံးလေ့ရှိသည်။ ဤဆောင်းပါးသည် PHP အတန်းများကိုအလိုအလျောက် 0 န် ဆောင်မှုပေးခြင်းနှင့်ထုံးစံအတိုင်း autoloader မှတဆင့်မည်သို့အကောင်အထည်ဖော်ရမည်ကိုပြသမည်

အလိုအလျောက်တင်ခြင်း၏အခြေခံသဘောတရားများ

အလိုအလျောက် 0 င်ရောက်ခြင်းလုပ်ဆောင်ချက်မရှိပါ။ ကျွန်ုပ်တို့သည်အတန်းတစ်ရပ်ကိုအသုံးပြုသောအခါတိုင်းအတန်းဖိုင်ကိုကိုယ်တိုင်မိတ်ဆက်ရန်လိုအပ်သည်။ ဥပမာအားဖြင့်:

 require_once 'path/to/MyClass.php';

$obj = new MyClass();

ဤနည်းလမ်းသည်ဖြစ်နိုင်ခြေရှိသော်လည်းအလုံအလောက်ပြောင်းလွယ်ပြင်လွယ်မရှိပါ။ စီမံကိန်းများသည်ကြီးမားလာသောအခါဖိုင်မိတ်ဆက်မှုလက်ဖြင့်စီမံခန့်ခွဲမှုသည်အလွန်ခက်ခဲသော, အမှားအယွင်းများဖြစ်ပေါ်နိုင်သည်။ အလိုအလျောက်တင်ခြင်းသည်ဤပြ problem နာကိုဖြေရှင်းနိုင်သည်။ သင် instantiate fatch သောအခါ PHP သည်အတန်း၏အဓိပ္ပါယ်ဖိုင်ကိုအလိုအလျောက်ဖွင့်လိမ့်မည်။

1 ။ spl_autoload_register ကို Automatic Loading ကိုအကောင်အထည်ဖော်ရန်

PHP တွင် autooloading ၏အသုံးအများဆုံးနည်းလမ်းမှာ SPL_Autoload_register မှတဆင့်ထုံးစံ autoloader function ကိုမှတ်ပုံတင်ရန်ဖြစ်သည်။ သင်မတင်ထားသည့်အတန်းတစ်ခုကိုသင်ဝင်ရောက်ကြည့်ရှုသောအခါဤလုပ်ဆောင်ချက်ကိုအလိုအလျောက်ဟုခေါ်လိမ့်မည်။

အဆင့် 1: Init function ကိုသတ်မှတ်ပါ

ကျွန်ုပ်တို့၏ဥပမာတွင် autoloader ကိုစတင်ရန် init function ကိုအသုံးပြုသည်။ ဒီ Init function ကိုကျွန်တော်တို့ရဲ့ autoloader ကိုမှတ်ပုံတင်။

 // autoloader.php စာချုပ်စာတမ်း

function init() {
    spl_autoload_register(function ($class_name) {
        // 定义类စာချုပ်စာတမ်း的路径,ယူဆချက်类စာချုပ်စာတမ်း保存在 "classes" စာချုပ်စာတမ်း夹下
        $file = __DIR__ . '/classes/' . $class_name . '.php';
        
        // 检查စာချုပ်စာတမ်း是否存在并加载
        if (file_exists($file)) {
            require_once $file;
        } else {
            throw new Exception("Class {$class_name} not found.");
        }
    });
}

ဤဥပမာတွင် Init function သည် spl_autoload_register မှတဆင့် autoloader () အဖြစ်အမည်မသိ function ကိုမှတ်ပုံတင်သည်။ PHP သည် Class ကိုဖွင့်ရန်လိုအပ်သည့်အခါတိုင်း SPL_Autoload_register () သည် ဤအမည်မသိ function ကိုအလိုအလျောက်ခေါ်ဆိုလိမ့်မည်။

အဆင့် 2: Init function ကိုခေါ်ပါ

ပရိုဂရမ်၏ startup လုပ်ငန်းစဉ်အတွင်း axtoleader ကိုမှတ်ပုံတင်ရန် Init function ကိုခေါ်ရန်လိုအပ်သည်။ များသောအားဖြင့်သင်သည် (ဥပမာ index.php ကဲ့သို့သော entry file တစ်ခုတွင်ခေါ်ဆိုမှုများကိုပြုလုပ်လိမ့်မည်။

 // index.php စာချုပ်စာတမ်း

require_once 'autoloader.php';

// အလိုအလျောက် loading function ကိုစတင်
init();

// ဘယ်အချိန်မှာအတန်းကိုအသုံးပြုတဲ့အခါ,不需要手动引入စာချုပ်စာတမ်း
$obj = new MyClass(); // ယူဆချက် MyClass အတန်းထဲတွင်တည်ရှိသည် "classes/MyClass.php"

ဤနည်းအားဖြင့် MyClass Instantiate လုပ်သည့်အခါ PHP သည် spl_autoload_register ကိုအလိုအလျောက်ခေါ်ဆိုလိမ့်မည်

2 ။ လူတန်းစားဖိုင်တင်ရန်အတွက် namespace ကိုသုံးပါ

Class Name ပ conflicts ိပက်ခများနှင့်ပိုမိုကောင်းမွန်သောစုစည်းမှုကိုရှောင်ရှားရန်ကျွန်ုပ်တို့သည်များသောအားဖြင့်အုပ်စုလိုက်အတန်းများသို့အမည်များကိုအသုံးပြုလေ့ရှိသည်။ အမည်များကိုအသုံးပြုသောအခါ, ကျွန်ုပ်တို့သည်အလိုအလျောက် 0 န်ဆောင်မှုပေးရန်အတွက်အလိုအလျောက်တင်ရန်အတွက် Autoloader ကိုချိန်ညှိနိုင်သည်။

ကျွန်ုပ်တို့တွင်အောက်ပါဖွဲ့စည်းပုံရှိသည်ဆိုပါစို့။

 /classes
    /App
        /Controller
            UserController.php

ထို့နောက် Usercontroller.php ဖိုင်ရှိကုဒ်သည်အောက်ပါအတိုင်းဖြစ်သည် -

 // classes/App/Controller/UserController.php

namespace App\Controller;

class UserController {
    public function __construct() {
        echo "UserController class is loaded.";
    }
}

စာသင်စုနယ်ဖုများဖြင့်အတန်းဖိုင်များတင်ခြင်းကိုအထောက်အကူပြုရန်ကျွန်ုပ်တို့သည် Init function ကိုပြင်ဆင်ရန်လိုအပ်သည်။

 // autoloader.php စာချုပ်စာတမ်း

function init() {
    spl_autoload_register(function ($class_name) {
        // 将命名空间转化为စာချုပ်စာတမ်း路径
        $class_name = str_replace('\\', '/', $class_name); 
        
        // 定义类စာချုပ်စာတမ်း的路径
        $file = __DIR__ . '/classes/' . $class_name . '.php';
        
        // 检查စာချုပ်စာတမ်း是否存在并加载
        if (file_exists($file)) {
            require_once $file;
        } else {
            throw new Exception("Class {$class_name} not found.");
        }
    });
}

File Path (Classes / app / controller / usercontroller.php) သည် Namespace (Apps \ ControllerControllertroller) ကိုအစားထိုးရန် str_replace (app) ကို အစားထိုးရန်။

3 ။ Class Files ၏ဖွဲ့စည်းပုံနှင့်အမည်များဆိုင်ရာစည်းဝေးကြီးများကိုလုပ်ဆောင်ပါ

ကျွန်ုပ်တို့သည်အမည်များကိုအသုံးပြုသောအခါကျွန်ုပ်တို့သည်အချို့သောဖိုင်တည်ဆောက်မှုစည်းဝေးကြီးများကိုလိုက်နာလေ့ရှိသည်။ ဥပမာအားဖြင့်, namespace တစ်ခုစီသည်ဖိုင်တွဲတစ်ခုနှင့်ကိုက်ညီပြီးအတန်းအစားအမည်သည်ဖိုင်အမည်နှင့်အတူတူဖြစ်သည်။ ဤစည်းဝေးကြီးက autoloader မှန်ကန်သောဖိုင်ကိုရှာရန်ကူညီသည်။

ဥပမာအားဖြင့်ကျွန်ုပ်တို့တွင်အတန်း အက်ပလီကေးရှင်း, \ controller \ usercontroller နှင့်၎င်း၏သက်ဆိုင်ရာဖိုင်လမ်းကြောင်းသည် အတန်း / အက်ပလီကေးရှင်း / controller / usercontroller / usercontroller / usercontroller / usercontroller / usercontroller / usercontroller / usercontroller / usercontroller / usercontroller / usercontroller / usercontroller.php ။ ဤစည်းဝေးကြီးကိုကျွန်ုပ်တို့လိုက်နာပါကကျွန်ုပ်တို့၏ autoloader သည်အတန်းအမည်များနှင့်အမည်များပေါ်တွင် အခြေခံ. ဖိုင်များကိုအဆင်ပြေစွာရှာဖွေနိုင်သည်။

4 ။ အကျဉ်းချုပ်

Init function နှင့် spl_autoload_register မှအကောင်အထည်ဖော်သည့်အလိုအလျောက်အတန်းအစားတင်ထားသောလုပ်ဆောင်ချက်သည် PHP စီမံကိန်းများ၏ကုဒ်စီမံခန့်ခွဲမှုဆိုင်ရာစီမံခန့်ခွဲမှုများကိုလွယ်ကူစွာရိုးရှင်းစေပြီးဖိုင်တွဲများကိုပြ trouble နာများကိုလျှော့ချနိုင်သည်။ namespace များအသုံးပြုခြင်းနှင့်အတူပေါင်းစပ်ခြင်းနှင့်အတူအလိုအလျောက် loading function သည်ပိုမိုရှင်းလင်းသောနှင့်ပိုမိုဖွဲ့စည်းထားသောကျင့်ထုံးအဖွဲ့ကိုထောက်ပံ့နိုင်သည်။

အလိုအလျောက်တင်ခြင်းသည်ဖွံ့ဖြိုးတိုးတက်မှုထိရောက်မှုကိုတိုးတက်စေသည်သာမကစီမံကိန်းဖွဲ့စည်းပုံကိုပိုမိုရှင်းလင်းစွာပြုလုပ်နိုင်သည်။ ဤနည်းအားဖြင့်ကျွန်ုပ်တို့သည် code ကိုကြီးမားသောစီမံကိန်းများတွင်သပ်သပ်ရပ်ရပ်နှင့်ထိထိရောက်ရောက်အသုံးချနိုင်ပါသည်။