Modern PHP ဖွံ့ဖြိုးတိုးတက်မှုတွင်အလိုအလျောက်တင်ဆောင်သည့်ယန္တရားများသည်မရှိမဖြစ်လိုအပ်သောအစိတ်အပိုင်းတစ်ခုဖြစ်လာသည်။ SPL_Autoload_register () , အတန်းအစားမ သတ်မှတ်ထားသော အချိန်တွင်စာသင်ချိန်၌မကိုက်ညီသောအခါ , သို့သော်အချို့သောကိစ္စရပ်များတွင်ကျွန်ုပ်တို့သည် Automatic Loading အမျိုးအစားကိုအကောင်အထည်ဖော်မှုအမျိုးအစားတစ်ခုသို့မဟုတ်အလိုအလျှောက်အလိုအလျှောက်အခြေခံအကျဆုံးအမျိုးအစားဖြစ်သည် ။
ဤဆောင်းပါးသည် Code ၏ကြံ့ခိုင်မှုနှင့်ထိန်းသိမ်းခြင်းကိုအလိုအလျောက် 0 ယ်ရန်အလိုအလျောက် 0 င် နိုင် သည့်အတန်းအမျိုးအစားစစ်ဆေးခြင်းကိုပြုလုပ်ရန်မည်သို့ပေါင်းစပ်မည်ကိုဤဆောင်းပါးသည်မည်သို့ပြုလုပ်ရမည်ကိုမိတ်ဆက်ပေးလိမ့်မည်။
spl_autoload_register () က ကျွန်ုပ်တို့အား autoload လုပ်ဆောင်ချက်တစ်ခုသို့မဟုတ်တစ်ခုထက်ပိုသောမှတ်ပုံတင်ရန်ခွင့်ပြုသည်။ undefined class ကိုကြိုးစားသည့်အခါတိုင်း PHP သည်ဤလုပ်ဆောင်ချက်များကိုအတန်းနှင့်အဓိပ္ပါယ်ဖွင့်ရန်ကြိုးစားရန်တောင်းဆိုထားသည်။
နမူနာကုဒ်သည်အောက်ပါအတိုင်းဖြစ်သည် -
spl_autoload_register(function ($class) {
$path = __DIR__ . '/classes/' . $class . '.php';
if (file_exists($path)) {
require_once $path;
}
});
အထက်ဖော်ပြပါကုဒ်သည် PPP ဖိုင်များကိုအတန်းအမည်ရှိ အတန်း လမ်းညွှန်နှင့်ကိုက်ညီသောဖိုင်များကိုရှာဖွေလိမ့်မည်။
အချို့သောအခြေအနေများတွင်အတန်းများကိုသာဖွင့်ခြင်းသည်မလုံလောက်ပါ။ အတန်းသည်အခြေစိုက်စခန်းအတန်းအစား၏ subclass, သို့မဟုတ် interface ကိုအကောင်အထည်ဖော်ခြင်းရှိမရှိကိုလည်းကျွန်ုပ်တို့လည်းသိလိုကြသည်။ ဒီအချိန်မှာသင်ဟာဆုံးဖြတ်ချက်ချဖို့ _a () ကို သုံးနိုင်တယ်။
if (class_exists($class) && is_a($class, 'SomeInterface', true)) {
// $class ဟုတ်ကဲ့ SomeInterface အကောင်အထည်ဖော်မှုအတန်း
}
သတိပြုရန်မှာဤနေရာတွင်တတိယ parameter သည် မှန်ကန်မှု ရှိကြောင်း,
အောက်တွင်ကျွန်ုပ်တို့အောက်တွင်ပြည့်စုံသောအလိုအလျောက် loader ကိုရေးပါ။
spl_autoload_register(function ($class) {
$baseDir = __DIR__ . '/classes/';
$file = $baseDir . $class . '.php';
if (file_exists($file)) {
require_once $file;
if (!is_a($class, 'App\\Contracts\\ServiceInterface', true)) {
throw new Exception("အမျိုးအစား {$class} အောင်မြင်ရမည်ဖြစ်သည် App\\Contracts\\ServiceInterface ထိသိျက်နှာ。");
}
} else {
throw new Exception("无法加载အမျိုးအစား {$class},ဖိုင်မတည်ရှိပါဘူး。");
}
});
ဤဥပမာတွင် 0 န်ဆောင်မှုအတန်းအားလုံးသည် အက်ပလီကေးရှင်းများ \ t 0 န်ဆောင်မှုများ interface ကိုအကောင်အထည်ဖော်ရမည်ဟုယူဆကြသည် အကယ်. အတန်းတစ်ခုသည် interface ကိုအကောင်အထည်မ 0 င်ပါကခြွင်းချက်တစ်ခုချထားသည်။
အထက်ပါကုဒ်ကိုအတည်ပြုရန်ကျွန်ုပ်တို့သည်အောက်ပါ class ကိုနှင့် interface ဖွဲ့စည်းပုံကိုဖန်တီးနိုင်သည်။
// ဖိုင်လမ်းကြောင်း:classes/MyService.php
namespace App\Services;
use App\Contracts\ServiceInterface;
class MyService implements ServiceInterface {
public function handle() {
echo "စီးပွားရေးယုတ္တိဗေဒကိုင်တွယ်ပါ";
}
}
// ဖိုင်လမ်းကြောင်း:classes/App/Contracts/ServiceInterface.php
namespace App\Contracts;
interface ServiceInterface {
public function handle();
}
ထို့နောက်၎င်းကိုအဓိကအစီအစဉ်တွင်သုံးပါ။
use App\Services\MyService;
$service = new MyService();
$service->handle();
MyService ကို ကျွန်ုပ်တို့ intietiate လုပ်သည့်အခါ Autoloader သည်အတန်းကိုဖွင့်ပြီး 0 န်ဆောင်မှုကို အကောင်အထည်ဖော်ခြင်းရှိမရှိစစ်ဆေးလိမ့်မည်။ အကယ်. ၎င်းကိုအကောင်အထည်ဖော်ခြင်းမရှိပါကခြွင်းချက်တစ်ခုချပစ်လိမ့်မည်။
spl_autoload_register () နှင့် is_a () ကိုပေါင်းစပ်ခြင်းအားဖြင့်ကျွန်ုပ်တို့သည်ပိုမိုခိုင်မာသည့်အလိုအလျောက်တင်ဆောင်သည့်ယန္တရားကိုအကောင်အထည်ဖော်နိုင်သည်။ It not only allows dynamically loading class files, but also enables you to verify that its type meets expectations immediately after the class is loaded. ဤချဉ်းကပ်မှုသည်မူဘောင်ဖွံ့ဖြိုးတိုးတက်မှု, plug-in စီမံခန့်ခွဲမှုသို့မဟုတ်ကြီးမားသောစနစ်ဗိသုကာများတွင်ခိုင်မာသည့်အမျိုးအစားအကန့်အသတ်များလိုအပ်သည့်အခြေအနေများအတွက်ဖြစ်ရပ်များအတွက်အကောင်းဆုံးဖြစ်သည်။