PHP တွင် is_a () function သည်အရာဝတ်ထုတစ်ခုသည်အချို့သောအရာဝတ်ထုတစ်ခုသို့မဟုတ် interface ကိုအကောင်အထည်ဖော်ခြင်းရှိမရှိဆုံးဖြတ်ရန်အသုံးပြုသည်။ ဤဆောင်းပါးသည်ဤပြ problem နာ၏အဓိကအကြောင်းရင်းများကိုတူးဖော်ပြီးဖြစ်နိုင်ချေရှိသောဖြေရှင်းနည်းများကိုပေးလိမ့်မည်။
is_a () function သည်အရာဝတ်ထုတစ်ခုသည်သတ်မှတ်ထားသောအတန်းအစားသို့မဟုတ်၎င်းသည်အတန်း၏ subclass ရှိမရှိစစ်ဆေးရန်အသုံးပြုသည်။ ပုံမှန်အသုံးပြုမှုမှာအောက်ပါအတိုင်းဖြစ်သည် -
if (is_a($obj, 'SomeClass')) {
// $obj ဟုတ်ကဲ့ SomeClass သို့မဟုတ်၎င်း၏ subclass ၏ဥပမာတစ်ခု
}
is_a () function ကို၏အခြေခံအလွှာသည်အရာဝတ်ထု၏အတန်းအမွေကိုကွင်းဆက်ကွင်းဆက်ကိုအကောင်အထည်ဖော်ရန်ဖြစ်သည်။
စရိုက်သည် PHP 5.4 တွင်မိတ်ဆက်ပေးသောကုဒ်ပြန်သုံးပစ္စည်းယန္တရားတစ်ခုဖြစ်သည်။ ရိုသည်လူတန်းစားတစ်ခုသို့မဟုတ်သဘာဝ၌ interface တစ်ခုမဟုတ်ပါ။ ၎င်းကိုသီးခြားစီချက်ချင်း နှိပ်. အမွေဆက်ခံကွင်းဆက်တွင်မပေါ်လာပါ။
ရိုးရှင်းတဲ့ဥပမာတစ်ခုပေးပါက:
trait Logger {
public function log($msg) {
echo $msg;
}
}
class User {
use Logger;
}
အသုံးပြုသူ အတန်းအစားသည် logger စရိုက်ကိုအသုံးပြုသော်လည်း logger သည် အတန်းမဟုတ်ပါ,
is_a () ကကတည်းကကတည်းကအတန်းအစားသို့မဟုတ် interface ဆက်ဆံရေးကိုဆုံးဖြတ်တဲ့အရာဝတ်ထုကိုဆုံးဖြတ်ပေးတဲ့ class ဒါမှမဟုတ် interface ဆက်ဆံရေးကတော့အတန်း အစား ဒါမှမဟုတ် interface တစ်ခုမဟုတ် ပါ။
$user = new User();
var_dump(is_a($user, 'Logger')); // false
ဘာဖြစ်လို့လဲဆိုတော့ logger ဟာ $ အသုံးပြုသူ အရာဝတ်ထုကိုလူတန်းစားဒါမှမဟုတ် interface မဟုတ်တဲ့အတွက်ကြောင့်မဟုတ်ဘူး။
is_a နှင့်အတူရို ကို တရားစီရင်ရန်မဖြစ်နိုင်သဖြင့်,
Class_uses () () အတန်းတစ်ခုအပါအဝင်စရိုက်များကို (အမွေဆက်ခံစရိုက်များအပါအ 0 င်) ကိုပြန်လည်ရောက်ရှိစေသည်။
if (in_array('Logger', class_uses($user))) {
echo "User ဆဲ Logger trait";
}
သို့သော် class_uses () () သည် ပုံမှန်အားဖြင့်အသုံးပြုသောစရိုက်ကိုပုံမှန်အားဖြင့်အသုံးပြုသောစရိုက်ကိုတိုက်ရိုက်ပြန်ပို့သည်ကိုသတိပြုပါ။ မိဘသင်တန်းများအားလုံးအသုံးပြုသောစရိုက်ကိုသင်ရရန်လိုအပ်ပါက၎င်းကိုပြန်လည်ထူထောင်ရန်အတွက်ထုံးစံ function ကိုသုံးနိုင်သည်။
function class_uses_recursive($class) {
$traits = [];
do {
$traits = array_merge($traits, class_uses($class));
} while ($class = get_parent_class($class));
return array_unique($traits);
}
if (in_array('Logger', class_uses_recursive($user))) {
echo "User ဆဲ Logger trait(မိဘအတန်းအစားအပါအဝင်)";
}
<?php
trait Logger {
public function log($msg) {
echo $msg;
}
}
class Base {
use Logger;
}
class User extends Base {}
$user = new User();
// အသုံးပြု is_a တရားစီရင်ချက် trait ရလဒ်ကတော့ false
var_dump(is_a($user, 'Logger')); // bool(false)
// အသုံးပြု class_uses_recursive တရားစီရင်ချက် trait
function class_uses_recursive($class) {
$traits = [];
do {
$traits = array_merge($traits, class_uses($class));
} while ($class = get_parent_class($class));
return array_unique($traits);
}
if (in_array('Logger', class_uses_recursive($user))) {
echo "User ဆဲ Logger trait";
} else {
echo "User 没有အသုံးပြု Logger trait";
}
is_a () ကိုစရိုက်ကိုအကဲဖြတ်ရန်အသုံးမပြုနိုင်ပါ။
စရိုက်ကိုအသုံးပြုသည်ကိုဆုံးဖြတ်ရန် Class_uses () function ကိုသုံးနိုင်သည်။
မိဘအတန်းအစားအသုံးပြုသောစရိုက်ကိုစစ်ဆေးရန်လိုအပ်ပါကမိဘအတန်းအားလုံး၏စရိုက်များကိုရယူရန်လိုအပ်သည်။
ဤနည်းလမ်းသည်နေ့စဉ်အသုံးပြုမှုအတွက်သင့်လျော်သောရိုးရှင်းပြီးအကျိုးရှိရှိဖြစ်သည်။
ရို၏သဘောသဘာဝကိုနားလည်ခြင်းအားဖြင့်ကျွန်ုပ်တို့သည်အရာဝတ်ထုနှင့်ရိုအကြားဆက်နွယ်မှုကိုဆုံးဖြတ်ရန်နည်းလမ်းများကိုမှန်ကန်စွာရွေးချယ်နိုင်ပြီး အလွဲသုံးစားမှုကြောင့်အလွဲသုံးစားမှု ကြောင့်ဖြစ်ပေါ်လာသောယုတ္တိအမှားများကိုရှောင်ရှားနိုင်သည်။