PHP OOP တွင် အော်တိုလိုဒ် ကလတ်စ်များအတွက် ကိုယ်ပိုင် function

မကြာခဏဆိုသလို ပုံသေ အော်တိုလိုဒ်စနစ်သည် အကြောင်းအမျိုးမျိုးကြောင့် သင့်အတွက် မသင့်တော်နိုင်ပါ။ ထိုသို့သောအခြေအနေမျိုးတွင် ကိုယ်ပိုင် အော်တိုလိုဒ်စနစ်တစ်ခုကို ရေးသားနိုင်ပါသည်။

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

php<?php
  spl_autoload_register(function($class) {
    // $class variable ထဲတွင် namespace နှင့်အတူ ကလတ်စ်အမည် ပါရှိမည်
  });
?>

Function ၏ တာဝန်မှာ ကလတ်စ်အမည်ကို အသုံးပြု၍ require မှတဆင့် ထိုကလတ်စ်ကို လိုအပ်သလို လုပ်ဆောင်ပေးရန်ဖြစ်သည်။ ဆိုလိုသည်မှာ ဤ function အတွင်းတွင် ကလတ်စ်များကို လိုအပ်သလို လုပ်ဆောင်ပေးရန် ကျွန်ုပ်တို့၏ ကိုယ်ပိုင် စည်းမျဉ်းကို၊ ဆိုလိုသည်မှာ ကျွန်ုပ်တို့၏ ကိုယ်ပိုင် အမည်ပေးစနစ်ကို ရေးသားထားရမည်ဖြစ်သည်။

ကျွန်ုပ်တို့၏ ကိုယ်ပိုင် အော်တိုလိုဒ်စနစ် ဥပမာတစ်ခုကို ရေးကြည့်ရအောင်။ ဥပမာအားဖြင့်၊ ဝဘ်ဆိုဒ် အမြစ်မှ ကလတ်စ် ဖိုင်လမ်းကြောင်းသည် namespace နှင့် တူညီမည်၊ သို့သော် စာလုံးပေါင်းအက္ခရာ အရွယ်အစားကို ထိန်းသိမ်းထားမည်ဟု ဆိုကြပါစို့။

ဆိုလိုသည်မှာ၊ ကျွန်ုပ်တို့တွင် Core\Admin\PageController ကလတ်စ်ရှိပါက၊ ထို့အတွက် လမ်းကြောင်းသည် Core/Admin/PageController.php ဖြစ်သင့်သည်။

မြင်တွေ့ရသည့်အတိုင်း၊ namespace နှင့်အတူ ကလတ်စ်အမည်ကို ပြောင်းလဲရန်အတွက် backslash များကို forward slash များအဖြစ် ပြောင်းလဲရုံသာ၊ ထို့နောက် ကလတ်စ်အမည်သို့ .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);
  });
?>

နောက်ထပ် အသေးစိတ်တစ်ခု ရှိပါသေးသည်။ အသစ်သော လည်ပတ်မှုစနစ်များတွင် ဖိုင်တွဲများရှိ လမ်းကြောင်းသည် forward slash သို့မဟုတ် backslash နှင့် ရှိနိုင်သည်။ ကျွန်ုပ်တို့၏ code ကို လည်ပတ်မှုစနစ်အပေါ် မှီခိုမှုမရှိစေရန် ပြုလုပ်ကြပါစို့။ ဤအတွက် လမ်းကြောင်းခွဲခြားရန် forward slash အစား DIRECTORY_SEPARATOR constant ကို အသုံးပြုမည်၊ ၎င်းသည် လက်ရှိတွင် ကျွန်ုပ်တို့၏ script ကို စတင်လည်ပတ်နေသော လည်ပတ်မှုစနစ်အတွက် မှန်ကန်သော slash ကို ပါဝင်ထားသည်။ နောက်ဆုံးတွင် အောက်ပါ code ကို ရရှိမည်ဖြစ်သည်။

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

ကျွန်ုပ်ဖန်တီးထားသော အော်တိုလိုဒ် function ကို စမ်းသပ်ကြည့်ပါ။

Задание 2

သင်၏ ကိုယ်ပိုင် အော်တိုလိုဒ်စည်းမျဉ်းကို စဉ်းစားပြီး ၎င်းကို အကောင်အထည်ဖော်ပါ။