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 များအပေါ်ခြေလှမ်းရန်လွယ်ကူသည်။
ဘုံအလွဲသုံးစားမှုနှင့်ထောင်ချောက်
- "ရရှိနိုင်" အဖြစ် "တည်ရှိ" အဖြစ်ဆက်ဆံပါ - "ရရှိနိုင်" : True Prover_exists သို့ ပြန်လာခြင်းကတန်ဖိုးကိုဖတ်လို့မရဘူး,
- NULL ကို "ပျောက်ဆုံး" အဖြစ်ဆက်ဆံပါ ။ array_key_key_exists နှင့် ternary / array_key_exists နှင့် ternary / route service များဖြင့်ညှိနှိုင်းရန်လိုအပ်သည်။
- မြင်သာ / မှော်နည်းလမ်းကိုလျစ်လျူရှုပါ ။ ၎င်းသည် မ မြင်နိုင် ပါ,
- 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 များကိုရွေးချယ်ပါ။ သင်၏ကုဒ်သည်ပိုမိုတည်ငြိမ်ပြီးထိန်းသိမ်းရန်ပိုမိုလွယ်ကူပါလိမ့်မည်။