လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Autoloader ကိုမှတ်ပုံတင်ထားခြင်းရှိမရှိဆုံးဖြတ်ရန်မည်သို့ဆုံးဖြတ်ရမည်နည်း Spl_autoload_UnRegister ၏လျှောက်လွှာ

Autoloader ကိုမှတ်ပုံတင်ထားခြင်းရှိမရှိဆုံးဖြတ်ရန်မည်သို့ဆုံးဖြတ်ရမည်နည်း Spl_autoload_UnRegister ၏လျှောက်လွှာ

gitbox 2025-06-04

PHP တွင် SPP တွင် Spl_autoload_register နှင့် Spl_autoload_Unregister သည် အတန်းများအတွက် autoloaders များကိုစီမံခန့်ခွဲရန်အစွမ်းထက်သောယန္တရားတစ်ခုပေးသည်။ သို့သော်ရှုပ်ထွေးသောစီမံကိန်းများသို့မဟုတ်မူဘောင်များတွင် autooloader သည်မအောင်မြင်သောမှတ်ပုံတင်ခြင်း, ဤဆောင်းပါးသည်အဓိကပြ issue နာကိုအာရုံစိုက်မည်။

အလိုအလျောက် loader ၏အခြေခံယန္တရား

Autoloading function များကို spl_autoload_register () နှင့်မှတ်ပုံတင်သည့်အခါဤလုပ်ဆောင်ချက်များကိုပြည်တွင်းရေး function stack တွင်သိမ်းဆည်းထားသည်။ undefined class ဟုခေါ်သောအခါမှသာ PHP သည်ဤ autooloaders များကိုဖွင့်ရန်ကြိုးစားရန်အလှည့်အပြောင်းသို့ခေါ်ဆိုပါလိမ့်မည်။

လက်ရှိမှတ်ပုံတင်ထားသော Autoloader စာရင်းကို SPL_AUTOLOAD_FUNITITRITITRITITRITITRITITRIENS မှတဆင့်ကြည့်ရှုနိုင်သည်။

 $autoloaders = spl_autoload_functions();
print_r($autoloaders);

ဤလုပ်ဆောင်ချက်သည်အမည်မသိလုပ်ဆောင်ချက်များ, လူတန်းစားနည်းစနစ်များ (static မဟုတ်သည့်) စသည်ဖြင့်မှတ်ပုံတင်ထားသောမှတ်ပုံတင်ထားသော autooloaders များအားလုံးစာရင်းတွင်ထည့်သွင်းထားသည်။

အလိုအလျောက် loader ရှိနေသေးသည်ရှိမရှိဆုံးဖြတ်ရန်

အလိုအလျောက်လွှင့်သူတစ် ဦး သည်အလိုအလျောက်လွှင့်သူ တစ် ဦး သည် Spl_Autoload_Functions () မှရရှိသောရလဒ်နှင့်နှိုင်းယှဉ်ခြင်းရှိမရှိဆုံးဖြတ်ရန်မှာတိုက်ရိုက်နည်းလမ်းဖြစ်သည်။ ကျွန်ုပ်တို့တွင်အောက်ပါမှတ်ပုံတင်ထားသော loader ရှိသည်ဆိုပါစို့။

 function myAutoloader($class) {
    include 'classes/' . $class . '.class.php';
}

spl_autoload_register('myAutoloader');

ဤနည်းအတိုင်းကျွန်ုပ်တို့ဆုံးဖြတ်နိုင်သည်။

 $autoloaders = spl_autoload_functions();

$isRegistered = false;
foreach ($autoloaders as $loader) {
    if ($loader === 'myAutoloader') {
        $isRegistered = true;
        break;
    }
}

echo $isRegistered ? 'မှတ်ပုံတင်ထားပါသည်' : 'မှတ်ပုံတင်မထားဘူး';

spl_autoload_Unregister ကို loader များကိုဘေးကင်းစွာဖယ်ရှားရန်အသုံးပြုပါ

loader ကိုမှတ်ပုံတင်ထားပြီး၎င်းကိုဖယ်ရှားလိုပါက Spl_Uutoload_Unregister ကို သုံးနိုင်သည်။

 if ($isRegistered) {
    spl_autoload_unregister('myAutoloader');
}

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

Loader ကိုအကဲဖြတ်ရန်နည်းလမ်းတစ်ခုအဖြစ်လူတန်းစားနည်းလမ်း

အတန်းအစားနည်းစနစ်များမှတ်ပုံတင်ပုံစံအတွက် (ဥပမာ - Classname Metteremname ') ) သို့မဟုတ်အရာဝတ်ထုနည်းလမ်းများကဲ့သို့သောတရားစီရင်ခြင်းနည်းလမ်းသည်ပိုမိုအသေးစိတ်ဖော်ပြသင့်သည်။ ဥပမာအားဖြင့်:

 class MyLoader {
    public static function load($class) {
        include 'libs/' . $class . '.php';
    }
}

spl_autoload_register(['MyLoader', 'load']);

ထိုကဲ့သို့သော loader တည်ရှိမှုရှိမရှိဆုံးဖြတ်ရန်သင်ဤသို့လုပ်နိုင်သည် -

 $autoloaders = spl_autoload_functions();

foreach ($autoloaders as $loader) {
    if (is_array($loader) && $loader[0] === 'MyLoader' && $loader[1] === 'load') {
        echo "MyLoader::load မှတ်ပုံတင်ထားပါသည်";
    }
}

အမည်မသိ function ကိုမှတ်ပုံတင်ခြင်းနှင့်ရင်ဆိုင်ဖြေရှင်းခြင်း

အမည်မသိလုပ်ဆောင်ချက်များကိုရိုးရာနည်းလမ်းများဖြင့်နှိုင်းယှဉ်။ မရပါ။ ဤအချိန်တွင် SPL_AUTOLOAD_FRIFITUITITRITES () တွင် closure function လုပ်တည်ဆောက်မှု ပြုလုပ်ရန် () မှအကြောင်းအရာများကိုသင်အသုံးပြုနိုင်သည်။ ဥပမာအားဖြင့်:

 $anonLoader = function($class) {
    include 'includes/' . $class . '.php';
};

spl_autoload_register($anonLoader);

// ဖယ်ရှားသည့်အခါမူရင်းရည်ညွှန်းလိုအပ်သည်
spl_autoload_unregister($anonLoader);

သိကောင်းစရာများ - လက်ရှိ loader အချက်အလက်အားလုံးကို output

loader status ကိုလျင်မြန်စွာ debug ချင်ပါသလား? Debugging function ကိုရေးပါ။

 function dumpAutoloaders() {
    echo "<pre>";
    foreach (spl_autoload_functions() as $loader) {
        if (is_string($loader)) {
            echo "Function: $loader\n";
        } elseif (is_array($loader)) {
            echo "Method: " . (is_object($loader[0]) ? get_class($loader[0]) : $loader[0]) . "::{$loader[1]}\n";
        } elseif ($loader instanceof Closure) {
            echo "Closure\n";
        }
    }
    echo "</pre>";
}

ဥပမာ Debug နောက်ခံသို့ထည့်သွင်းပါ။

 // gitbox.net/tools/debug.php
require 'debug_tools.php';
dumpAutoloaders();

၎င်းသည်မည်သည့် 0 စီး 0 ယ်သူများအားလက်ရှိမှတ်ပုံတင်ထားကြောင်းစစ်ဆေးရန်လွယ်ကူစေသည်။

အကျဉ်းချုပ်

အလိုအလျောက် loader တည်ရှိမှုရှိမရှိကိုဆုံးဖြတ်ရန် Spl_Autoload_Functions () ကို နှိုင်းယှဉ်ခြင်းနှင့်ပေါင်းစပ်ရန်သင့်လျော်သောခြွင်းချက်စီရင်ခြင်းနှင့်နှိုင်းယှဉ်ရန်နှင့်ပေါင်းစပ်ရန်စာရင်းကိုသုံးနိုင်သည်။ တိုက်ရိုက်တရားစီရင်ခြင်းမပြုနိုင်သောအမည်မသိလုပ်ဆောင်ချက်များအချို့အတွက်နောက်ဆက်တွဲတရားစီရင်ခြင်းသို့မဟုတ်ဖျက်သိမ်းခြင်းအတွက်မှတ်ပုံတင်ခြင်းတွင်ရည်ညွှန်းချက်ကိုသိမ်းဆည်းထားနိုင်သည်။ ကျိုးကြောင်းဆီလျော်သောအသုံးပြုမှု၏ရဝုဏ်တွင် SPL_Autoload_Unregister သည် မမှန်ကန်သောသို့မဟုတ်ပ conflict ိပက်ခများကိုထိထိရောက်ရောက်သန့်ရှင်းရေးလုပ်ခြင်းစနစ်အား 0 င်ရောက်နိုင်ခြင်းနှင့်ထိန်းသိမ်းမှုကိုတိုးတက်စေရန်အတွက် 0 န်ဆောင်မှုကိုထိထိရောက်ရောက်သန့်ရှင်းနိုင်သည်။