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

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

gitbox 2025-09-11

Property_exists နှင့် is iset အကြားခြားနားချက်ကိုအသေးစိတ်ခွဲခြမ်းစိတ်ဖြာခြင်းနှင့်သူတို့၏သက်ဆိုင်ရာအားသာချက်များနှင့်အားနည်းချက်များကားအဘယ်နည်း။

Property_Exists () နှင့် is isset () is isset () ကို "အရာဝတ်ထုဂုဏ်သတ္တိများရှိမရှိတရားသူကြီး" ကိုလေ့ကျင့်ရန်အသုံးပြုလေ့ရှိသည်။ သို့သော်နှစ်ခု၏ semantics သည်အတူတူမဟုတ်ကြပါ။ ယခင်က attribute ာရီသို့မဟုတ်အတန်းထဲတွင်ကြေငြာသည်, ဤခြားနားချက်ကိုနားလည်ခြင်းသည်အချည်းနှီးသောညွှန်ကြားချက်များ,

ဝါကျနိဂုံးချုပ်

  • Property_Exists (\ $ $ onj, x ') - မည်သည့်တန်ဖိုးရှိသနည်း ( Null , Unlitialized type attribute attribute attribute များ ,
  • ထုတ်ပေးရန် (\ $ OBJ-> X) - " x သတ်မှတ်ထားခြင်းမရှိ , Null , Universet နှင့် Uninitialized အမျိုးအစား attributes အားလုံးသည်အားလုံး မှားယွင်းစွာ ပြန်လာကြသည်။ __اisset () overloaded property များအတွက်အစပျိုးသည်။

core နှိုင်းယှဉ်ဇယား

မျက်နှာမ Property_exists ထားခြင်း
attribute ကြေငြာချက်တည်ရှိပြီးတန်ဖိုးသည် null မဟုတ်ပါ တရားဝင် တရားဝင်
အဆိုပါ attribute ကြေငြာချက်တည်ရှိနှင့်တန်ဖိုး null ဖြစ်ပါတယ် တရားဝင် မှားသော
attribute ကိုကြေငြာခြင်းမရှိပါ မှားသော false (နှင့် may __ မစ်ာ )
ပုဂ္ဂလိက / ကာကွယ်ထားသောဂုဏ်သတ္တိများ တရားဝင် ၎င်းကိုမြင်နိုင် / အကောင်အထည်ဖော်မှု ကိုအကောင်အထည်ဖော်ခြင်းရှိမရှိပေါ်တွင်မူတည်သည်။
Attribute ကိုရိုက်ပါ (မစတင်ပါ) တရားဝင် မှားယွင်းသော (တိုက်ရိုက် 0 င်ရောက်မှုသည်အမှားအယွင်းများ ပစ်ချ လိမ့်မည်။
Dynamic Properties (8.2+ ပုံမှန်ကန့်ကွက်ဖန်တီးမှု) တည်ရှိမှုသည်မှန်သည် ကတည်ရှိသောအခါနှင့် null မပါသောအခါ
မှော်နည်းလမ်းကိုဖြစ်ပေါ်စေခြင်းရှိမရှိ __ ဂန် / __ __ offset ကို အစပျိုးခြင်းမပြုပါနှင့် __ ကန်အချပ်များဖြစ်ပေါ်လိမ့်မည်
အတန်းအမည်ရှိကြိုးများပေါ်တွင်အသုံးပြုနိုင်သည် ဟုတ်ကဲ့ (အတန်း၏ကြေငြာထားသောဂုဏ်သတ္တိများကိုစစ်ဆေးပါ) မဟုတ်ပါ (variable / object access ကိုအသုံးပြုရန်လိုအပ်သည်)
စွမ်းဆောင်ရည် (အကြမ်းအားဖြင့်) function ခေါ်ဆိုမှု, အနည်းငယ်နှေးကွေး ဘာသာစကားဖွဲ့စည်းပုံ, အလွန်အစာရှောင်ခြင်း

အနည်းဆုံးဥပမာ - ကွာခြားချက်ကိုကြည့်ပါ

 <?php
class User {
    public ?string $nickname = null;   // ကြေငြာ,ဒါပေမဲ့ null
    private int $age = 18;             // ပုဂ္ဂလိက attribute တွေ
}

\$u = new User();

var_dump(property_exists(\$u, 'nickname')); // true:ဉစ်စာပစ္စည်းများ“တည်နေ”
var_dump(isset(\$u->nickname));             // false:တန်ဖိုး null

var_dump(property_exists(\$u, 'age'));      // true:ကပင်လျှင် private အကြွင်းမဲ့“တည်နေ”
var_dump(isset(\$u->age));                  // false:မမြင်နိုင်ဘူး,နှင့်အကောင်အထည်ဖော်မှုမ __isset

var_dump(property_exists(\$u, 'email'));    // false:မဖော်ပြထားဘူး/不တည်နေ
var_dump(isset(\$u->email));                // false:အရာဝတ်ထုပေါ်မှာမဟုတ်ပါဘူး

ရိုက်ထားသောဂုဏ်သတ္တိများနှင့်အပြန်အလှန်ဆက်သွယ်မှု

PHP 7.4 ကတည်းက type attribute တွေ "ကြေငြာပေမယ့်မနွေးထွေးသေး" နိုင်ပါတယ်။ အခုအချိန်တွင်:

  • Property_Exists : True (ကြေငြာချက်တည်ရှိနေသောကြောင့်)
  • ထုတ်ပေးရန် (\ $ obj-> propp) : false ; အကယ်. သင်ဖတ်ပါက, obj-> ကျားကန် တိုက်ရိုက်ထုတ်လွှကြည့် လျှင်အမှားတစ်ခုပေါ်ပေါက်လာလိမ့်မည်။
 <?php
class Post {
    public string $title;  // မစ
}
\$p = new Post();

var_dump(property_exists(\$p, 'title')); // true
var_dump(isset(\$p->title));             // false
// echo \$p->title; // ဆိုးဝါးအမှား:မစ的类型ဉစ်စာပစ္စည်းများ

မှော်နည်းလမ်းများနှင့်ပူးပေါင်းဆောင်ရွက်မှု

အတန်းအစားကိုအကောင်အထည်ဖော်သည့်အခါ Attribute Overloading ( __Get / __ Set / __ __ __ __ __ __ __

  • Property_exists သည် __ ဂျက် သို့မဟုတ် __ မစ်စတ လိုကို ဖြစ်ပေါ်ပါ။ ၎င်းသည် "Real attribute table" ကိုသာကြည့်သည်။
  • ထုတ်ပေးရန် (\ $ OBJ-> X) သည် သင်က "သတ်မှတ်ထားသည်ဟုယူဆသည်ဖြစ်စေ) စိတ်ကြိုက်ပြင်ဆင်ရန် __اisset ('x') ကို ခေါ်ရန်ကြိုးစားလိမ့်မည်။
 <?php
class Box {
    private array \$data = ['a' => null, 'b' => 1];

    public function __isset(string \$name): bool {
        // စိတ်တိုင်းပြု:只要键တည်နေ就算“အစုံ”(哪怕တန်ဖိုး null)
        return array_key_exists(\$name, \$this->data);
    }
}

\$box = new Box();
var_dump(isset(\$box->a)); // true(အကေြာင်းမှာ __isset ပြန်လာ true)

Dynamic Properties နှင့် PHP 8.2+

PHP 8.2 မှစတင်. ပုံမှန်သင်တန်းများအတွက် attribute များ ( \ $ obj-> foo = 1 နှင့် 1 နှင့်အတန်းတွင် foo ) သည် ပုံမှန်အားဖြင့်သတိပေးချက်များကိုဖယ်ရှားပေးလိမ့်မည်။ အကြံပြုထားတဲ့အလေ့အကျင့်များ

  • အတိအလင်း attribute တွေကိုကြေငြာ; သို့မဟုတ်
  • # [AllowdYNamicPerties] ကို စာသင်ခန်းတွင်သုံးပါ။ သို့မဟုတ်
  • stdclass / explicit attribute သိုလှောင်ရုံကွန်တိန်နာကိုသုံးပါ။

အရာဝတ်ထုသည်ဤပိုင်ဆိုင်မှုရှိပါက

  • Property_exists (\ $ $ obj, foo ') သည် မှန်ကန် သည်။
  • ထုတ်ပေးရန် (\ $ obj-> foo) သည် ၎င်း၏တန်ဖိုးသည် Null သည် ဖြစ်စေပေါ်တွင်မူတည်သည်။

တစ်ခုချင်းစီတွင်ကိုယ်ပိုင်အားသာချက်များနှင့်အားနည်းချက်များရှိသည်

Property_exists

  • အားသာချက်များ - Semantics သည်ရှင်းလင်းသော (ကြေငြာသည်ဖြစ်စေ, ကြေငြာသည်ဖြစ်စေ, အကာအကွယ်ပေးထားသော attribute များကိုစစ်ဆေးနိုင်သည်။
  • ဆိုးကျိုးများ - "Indondized / Non-Non-Non-Non-Non-Non-Non-Non-Null" မဟုတ်သည်ကိုအကဲဖြတ်ရန်မဖြစ်နိုင်ပါ။

ထားခြင်း

  • အားသာချက်များ - အလွန်အမင်းမြန်ဆန်ခြင်း, စီးပွားရေး semantics များကိုဖော်ပြရန် __اisset နှင့် ပူးပေါင်း. "No Null မရရှိနိုင်" ကိုထိုးထွင်းသိမြင်ခြင်း။
  • ဆိုးကျိုးများ - Null သည် "ပျောက်ဆုံးနေသောတန်ဖိုး" နှင့် "ပျောက်ဆုံးနေသောတန်ဖိုး" နှင့်ရှုပ်ထွေးစေရန်လွယ်ကူသော "unset" ဟုမှတ်ယူသည်။ ၎င်းကိုအတန်းအမည်ရှိကြိုးများဖြင့်အသုံးမပြုပါ။ မကမူများကို uninitialized type altifies များအပေါ်ခြေလှမ်းရန်လွယ်ကူသည်။

ဘုံအလွဲသုံးစားမှုနှင့်ထောင်ချောက်

  1. "ရရှိနိုင်" အဖြစ် "တည်ရှိ" အဖြစ်ဆက်ဆံပါ - "ရရှိနိုင်" : True Prover_exists သို့ ပြန်လာခြင်းကတန်ဖိုးကိုဖတ်လို့မရဘူး,
  2. NULL ကို "ပျောက်ဆုံး" အဖြစ်ဆက်ဆံပါarray_key_key_exists နှင့် ternary / array_key_exists နှင့် ternary / route service များဖြင့်ညှိနှိုင်းရန်လိုအပ်သည်။
  3. မြင်သာ / မှော်နည်းလမ်းကိုလျစ်လျူရှုပါ ၎င်းသည်မြင်နိုင် ပါ,
  4. 8.2+ အတွက် dynamic properties : မရည်ရွယ်ဘဲပြောင်းလဲနေသောဂုဏ်သတ္တိများဖန်တီးမှုဖန်တီးမှုသည်တန်ဖိုးရှိသတိပေးချက်တစ်ခုဖြစ်ပြီး၎င်းကိုအတိအလင်းကြေငြာရန်အကြံပြုသည်။

လက်တွေ့ကျတဲ့မော်ဒယ်များနှင့်အကောင်းဆုံးအလေ့အကျင့်များ

1. "ကြေငြာချက်တည်ရှိသည်" ကိုအတည်ပြုပါ။ သို့သော်တန်ဖိုးကိုဂရုမစိုက်ပါ

 <?php
if (property_exists(\$user, 'id')) {
    // သင်ကန ဦး ရှိမရှိထပ်မံဆုံးဖြတ်နိုင်သည်/မဟုတ် null
}

2) အတည်ပြု "ရရှိနိုင်နှင့် non-null"

 <?php
if (isset(\$user->id)) {
    // လုံခြုံစိတ်ချရသောအသုံးပြုမှု \$user->id
}

3) "null" နှင့် "ပျောက်ဆုံး" (array / data mapping) ကိုခွဲခြားရန်လိုအပ်သည်။

 <?php
// ခင်းကျင်းမြင်ကွင်း:ကျေးဇူးပြုပြီးသုံးပါ array_key_exists
\$data = ['a' => null];

var_dump(isset(\$data['a']));              // false
var_dump(array_key_exists('a', \$data));   // true:键တည်နေ,တန်ဖိုး null

4) တည်ရှိမှုနှင့်ရရှိနိုင်မှုနှစ်ခုစလုံးကိုအကဲဖြတ်ရန်လိုအပ်သည်

 <?php
if (property_exists(\$dto, 'amount') && isset(\$dto->amount)) {
    // တစ်ချိန်တည်းမှာတွေ့ဆုံရန်“声明တည်နေ”နှင့်“မဟုတ် null အသုံးပြုနိုင်”
}

5) interface / DTO အတွက်တည်ငြိမ်သောအရေးအသားနည်းလမ်း (type attributes အပါအ 0 င်)

 <?php
class OrderDTO {
    public ?int \$amount = null;   // ရှင်းလင်းပြတ်သားစွာ semantics
}
\$o = new OrderDTO();

// အရည်အချင်းနှင့်ပုံမှန်
\$value = \$o->amount ?? 0; // ဗလာပေါင်းစည်း:null သို့မဟုတ်မသတ်မှတ်သည့်အခါ default တန်ဖိုးကိုပေးပါ

ဘယ်သူရွေးရမလဲ။

  • "ဖွဲ့စည်းတည်ဆောက်ပုံဆိုင်ရာစစ်ဆေးခြင်း" သို့မဟုတ် "Reflective Check" (Class ကပစ္စည်းဥစ်စာကိုကြေငြာခြင်းရှိမရှိသို့မဟုတ် interface နှင့် သဟဇာတ ဖြစ်ပါသလား။
  • "စီးပွားရေးရရှိနိုင်မှုတရားစီရင်မှု" (ပစ္စည်းဥစ်စာပိုင်ဆိုင်မှုကိုသတ်မှတ်ခြင်းနှင့် null မဟုတ်လျှင်သာရနိုင်သည်) ကို အသုံးပြုပါ။
  • Type Attribute များကြုံတွေ့ရခြင်း - မဖတ်ရှုခြင်းမပြုပါနှင့်။ ထုတ်ပေးသည် မှားသော ပြန်လာပြီးလုံခြုံရေးကင်းစင်သည်။
  • __اissetကို အကောင်အထည်ဖော်ခြင်းဖြင့် Overload: Custom "Custom" စည်းမျဉ်းများနှင့်ပူးပေါင်းဆောင်ရွက်ရန်လိုအပ်သည်

ကောက်ချက်

"ဖြစ်တည်မှု" မှ "ဖြစ်တည်မှု" မှ "ရရှိနိုင်မှု" မှခွဲထုတ်ခြင်းသည် အိမ်ခြံမြေများ သို့မဟုတ် osset ကို ရွေးချယ်ခြင်းအတွက်သော့ချက်ဖြစ်သည်။ ယခင်အဖြေများက "ဒီ attribute ကဒီမှာလား" ပြီးတော့အဆုံးစွန်သောအဖြေကိုယခုအသုံးပြုနိုင်သည်။ Semantics မှ Tools များကိုရွေးချယ်ပါ။ သင်၏ကုဒ်သည်ပိုမိုတည်ငြိမ်ပြီးထိန်းသိမ်းရန်ပိုမိုလွယ်ကူပါလိမ့်မည်။

ဆက်စပ်အကြောင်းအရာ