လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> စရိုက်များသည်စရိုက်များကိုအကဲဖြတ်သည့်အခါ PHP ၏ IS_A () လုပ်ဆောင်မှုသည်အဘယ်ကြောင့်ပျက်ကွက်သနည်း။ ခွဲခြမ်းစိတ်ဖြာခြင်းနှင့်ဖြေရှင်းချက်အကြောင်းမရှိ

စရိုက်များသည်စရိုက်များကိုအကဲဖြတ်သည့်အခါ PHP ၏ IS_A () လုပ်ဆောင်မှုသည်အဘယ်ကြောင့်ပျက်ကွက်သနည်း။ ခွဲခြမ်းစိတ်ဖြာခြင်းနှင့်ဖြေရှင်းချက်အကြောင်းမရှိ

M66 2025-06-15

PHP တွင် is_a () function သည်အရာဝတ်ထုတစ်ခုသည်အချို့သောအရာဝတ်ထုတစ်ခုသို့မဟုတ် interface ကိုအကောင်အထည်ဖော်ခြင်းရှိမရှိဆုံးဖြတ်ရန်အသုံးပြုသည်။ ဤဆောင်းပါးသည်ဤပြ problem နာ၏အဓိကအကြောင်းရင်းများကိုတူးဖော်ပြီးဖြစ်နိုင်ချေရှိသောဖြေရှင်းနည်းများကိုပေးလိမ့်မည်။

1 ။ is_a () function ကိုမိတ်ဆက်

is_a () function သည်အရာဝတ်ထုတစ်ခုသည်သတ်မှတ်ထားသောအတန်းအစားသို့မဟုတ်၎င်းသည်အတန်း၏ subclass ရှိမရှိစစ်ဆေးရန်အသုံးပြုသည်။ ပုံမှန်အသုံးပြုမှုမှာအောက်ပါအတိုင်းဖြစ်သည် -

 if (is_a($obj, 'SomeClass')) {
    // $obj ဟုတ်ကဲ့ SomeClass သို့မဟုတ်၎င်း၏ subclass ၏ဥပမာတစ်ခု
}

is_a () function ကို၏အခြေခံအလွှာသည်အရာဝတ်ထု၏အတန်းအမွေကိုကွင်းဆက်ကွင်းဆက်ကိုအကောင်အထည်ဖော်ရန်ဖြစ်သည်။

2 ။ ရို၏သဘောသဘာဝ

စရိုက်သည် PHP 5.4 တွင်မိတ်ဆက်ပေးသောကုဒ်ပြန်သုံးပစ္စည်းယန္တရားတစ်ခုဖြစ်သည်။ ရိုသည်လူတန်းစားတစ်ခုသို့မဟုတ်သဘာဝ၌ interface တစ်ခုမဟုတ်ပါ။ ၎င်းကိုသီးခြားစီချက်ချင်း နှိပ်. အမွေဆက်ခံကွင်းဆက်တွင်မပေါ်လာပါ။

ရိုးရှင်းတဲ့ဥပမာတစ်ခုပေးပါက:

 trait Logger {
    public function log($msg) {
        echo $msg;
    }
}

class User {
    use Logger;
}

အသုံးပြုသူ အတန်းအစားသည် logger စရိုက်ကိုအသုံးပြုသော်လည်း logger သည် အတန်းမဟုတ်ပါ,

iii ။ is_a () ကရိုပျက်မှုအတွက်အကြောင်းပြချက်ကိုဆုံးဖြတ်သည်

is_a () ကကတည်းကကတည်းကအတန်းအစားသို့မဟုတ် interface ဆက်ဆံရေးကိုဆုံးဖြတ်တဲ့အရာဝတ်ထုကိုဆုံးဖြတ်ပေးတဲ့ class ဒါမှမဟုတ် interface ဆက်ဆံရေးကတော့အတန်း အစား ဒါမှမဟုတ် interface တစ်ခုမဟုတ် ပါ။

 $user = new User();

var_dump(is_a($user, 'Logger')); // false

ဘာဖြစ်လို့လဲဆိုတော့ logger ဟာ $ အသုံးပြုသူ အရာဝတ်ထုကိုလူတန်းစားဒါမှမဟုတ် interface မဟုတ်တဲ့အတွက်ကြောင့်မဟုတ်ဘူး။

4 ။ အရာဝတ်ထုကဘာကိုလက်ခဏာကိုအသုံးပြုမရှို့ကိုဘယ်လိုဆုံးဖြတ်ရမလဲ။

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(မိဘအတန်းအစားအပါအဝင်)";
}

V. ပြီးပြည့်စုံသောဥပမာ

 <?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";
}

6 ။ အကျဉ်းချုပ်

  • is_a () ကိုစရိုက်ကိုအကဲဖြတ်ရန်အသုံးမပြုနိုင်ပါ။

  • စရိုက်ကိုအသုံးပြုသည်ကိုဆုံးဖြတ်ရန် Class_uses () function ကိုသုံးနိုင်သည်။

  • မိဘအတန်းအစားအသုံးပြုသောစရိုက်ကိုစစ်ဆေးရန်လိုအပ်ပါကမိဘအတန်းအားလုံး၏စရိုက်များကိုရယူရန်လိုအပ်သည်။

  • ဤနည်းလမ်းသည်နေ့စဉ်အသုံးပြုမှုအတွက်သင့်လျော်သောရိုးရှင်းပြီးအကျိုးရှိရှိဖြစ်သည်။

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