PHP တွင် SPP တွင် Spl_autoload_register နှင့် Spl_autoload_Unregister သည် အတန်းများအတွက် autoloaders များကိုစီမံခန့်ခွဲရန်အစွမ်းထက်သောယန္တရားတစ်ခုပေးသည်။ သို့သော်ရှုပ်ထွေးသောစီမံကိန်းများသို့မဟုတ်မူဘောင်များတွင် autooloader သည်မအောင်မြင်သောမှတ်ပုံတင်ခြင်း, ဤဆောင်းပါးသည်အဓိကပြ issue နာကိုအာရုံစိုက်မည်။
Autoloading function များကို spl_autoload_register () နှင့်မှတ်ပုံတင်သည့်အခါဤလုပ်ဆောင်ချက်များကိုပြည်တွင်းရေး function stack တွင်သိမ်းဆည်းထားသည်။ undefined class ဟုခေါ်သောအခါမှသာ PHP သည်ဤ autooloaders များကိုဖွင့်ရန်ကြိုးစားရန်အလှည့်အပြောင်းသို့ခေါ်ဆိုပါလိမ့်မည်။
လက်ရှိမှတ်ပုံတင်ထားသော Autoloader စာရင်းကို SPL_AUTOLOAD_FUNITITRITITRITITRITITRITITRIENS မှတဆင့်ကြည့်ရှုနိုင်သည်။
$autoloaders = spl_autoload_functions();
print_r($autoloaders);
ဤလုပ်ဆောင်ချက်သည်အမည်မသိလုပ်ဆောင်ချက်များ, လူတန်းစားနည်းစနစ်များ (static မဟုတ်သည့်) စသည်ဖြင့်မှတ်ပုံတင်ထားသောမှတ်ပုံတင်ထားသော autooloaders များအားလုံးစာရင်းတွင်ထည့်သွင်းထားသည်။
အလိုအလျောက်လွှင့်သူတစ် ဦး သည်အလိုအလျောက်လွှင့်သူ တစ် ဦး သည် 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 ? 'မှတ်ပုံတင်ထားပါသည်' : 'မှတ်ပုံတင်မထားဘူး';
loader ကိုမှတ်ပုံတင်ထားပြီး၎င်းကိုဖယ်ရှားလိုပါက Spl_Uutoload_Unregister ကို သုံးနိုင်သည်။
if ($isRegistered) {
spl_autoload_unregister('myAutoloader');
}
ဤလုပ်ဆောင်ချက်ကို 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 မှတ်ပုံတင်ထားပါသည်";
}
}
အမည်မသိလုပ်ဆောင်ချက်များကိုရိုးရာနည်းလမ်းများဖြင့်နှိုင်းယှဉ်။ မရပါ။ ဤအချိန်တွင် SPL_AUTOLOAD_FRIFITUITITRITES () တွင် closure function လုပ်တည်ဆောက်မှု ပြုလုပ်ရန် () မှအကြောင်းအရာများကိုသင်အသုံးပြုနိုင်သည်။ ဥပမာအားဖြင့်:
$anonLoader = function($class) {
include 'includes/' . $class . '.php';
};
spl_autoload_register($anonLoader);
// ဖယ်ရှားသည့်အခါမူရင်းရည်ညွှန်းလိုအပ်သည်
spl_autoload_unregister($anonLoader);
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 န်ဆောင်မှုကိုထိထိရောက်ရောက်သန့်ရှင်းနိုင်သည်။