PHP जांचें कि संपत्ति वस्तु या वर्ग में मौजूद है या नहीं


159

मैं समझता हूं कि PHP के पास एक शुद्ध वस्तु चर नहीं है, लेकिन मैं यह जांचना चाहता हूं कि क्या कोई संपत्ति दी गई वस्तु या वर्ग में है।

$ob = (object) array('a' => 1, 'b' => 12); 

या

$ob = new stdClass;
$ob->a = 1;
$ob->b = 2;

में जे एस, मैं अगर चर की जाँच करने में लिख सकते हैं aएक वस्तु में मौजूद है:

if ('a' in ob)

में पीएचपी, इस तरह कुछ भी किया जा सकता है?

आपकी सलाह के लिए बहुत - बहुत धन्यवाद।


2
सिर्फ उल्लेख करते हुए ... जब हम OOP करते हैं, तो हम कहते हैं कि संपत्ति परिवर्तनशील नहीं है, जैसे हम कहते हैं कि विधि, कार्य नहीं।
क्रिस्टोफर बोनिट्ज

जवाबों:


254

property_exists (मिश्रित $ वर्ग, स्ट्रिंग $ संपत्ति)

if (property_exists($ob, 'a')) 

isset (मिश्रित $ var [, मिश्रित $ ...])

if (isset($ob->a))

isset () झूठा वापस आएगा यदि संपत्ति अशक्त है

उदाहरण 1:

$ob->a = null
var_dump(isset($ob->a)); // false

उदाहरण 2:

class Foo
{
   public $bar = null;
}

$foo = new Foo();

var_dump(property_exists($foo, 'bar')); // true
var_dump(isset($foo->bar)); // false

12
जरूरी नहीं है, अगर संपत्ति मौजूद है, लेकिन परिभाषित नहीं है () गलत है। us3.php.net/manual/en/types.comparison.php
मिशेल

isset () को संपत्ति और मूल्य दोनों की जांच के लिए खाली () के साथ जोड़ा जा सकता है ।

4
जबकि ऑफसेट () गलत उत्तर है, यदि आप कैविट से अवगत हैं, तो यह प्रॉपर्टी_एक्सिस्ट्स () की तुलना में काफी तेज है
निको वेस्टरडेल

क्या यह एक empty()बेहतर समाधान है? !empty($var)?
b_dubb

1
@b_dubb नहीं, खाली सरणी, 0, असत्य, अशक्त, '' सभी सही 'द्वारा खाली' ()
पीटर

61

यह जाँचने के लिए कि क्या संपत्ति मौजूद है और यदि यह शून्य है, तो आप फ़ंक्शन का उपयोग कर सकते हैं property_exists()

डॉक्स: http://php.net/manual/en/function.property-exists.php

के रूप में isset () के साथ विरोध किया, property_exists () TRUE लौटाता है भले ही संपत्ति का मान NULL हो।

बूल property_exists (मिश्रित $ वर्ग, स्ट्रिंग $ संपत्ति)

उदाहरण:

if (property_exists($testObject, $property)) {
    //do something
}

7
इसे स्वीकृत उत्तर के रूप में चिह्नित किया जाना चाहिए क्योंकि यह स्पष्ट उत्तर का सटीक उत्तर देता है। एक वस्तु में संपत्ति के अस्तित्व के परीक्षण के लिए isset उपयोगी नहीं है।
क्रिस्टोफर बोनिट्ज

11

मेरे लिए न तो परेशान है और न ही प्रॉपर्टी_एक्सिस्ट काम करते हैं।

  • यदि संपत्ति मौजूद है तो isset गलत है, लेकिन NULL है।
  • अगर संपत्ति वस्तु की वर्ग परिभाषा का हिस्सा है, भले ही वह परेशान रहा हो, तो property_exists सही है।

मैंने समाप्त किया:

    $exists = array_key_exists($property, get_object_vars($obj));

उदाहरण:

    class Foo {
        public $bar;

        function __construct() {
            $property = 'bar';

            isset($this->$property); // FALSE
            property_exists($this, $property); // TRUE
            array_key_exists($property, get_object_vars($this)); // TRUE

            unset($this->$property);

            isset($this->$property); // FALSE
            property_exists($this, $property); // TRUE
            array_key_exists($property, get_object_vars($this)); // FALSE

            $this->$property = 'baz';

            isset($this->$property); // TRUE
            property_exists($this, $property); // TRUE
            array_key_exists($property, get_object_vars($this));  // TRUE
        }
    }

Property_exist + परेशान संपत्ति शायद छोटी गाड़ी व्यवहार का कारण बनती है। यह सबसे सुरक्षित तरीका लगता है
थान ट्रुंग

array_key_exists () पीएचपी में
घटाया गया है

"Array_key_exists () ऑब्जेक्ट्स पर डिप्रेस्ड का उपयोग करना" ऑब्जेक्ट्स है। get_object_vars () एक सरणी देता है, इसलिए हम अभी भी अच्छे हैं।
स्मारकोट

7

उपाय

echo $person->middleName ?? 'Person does not have a middle name';

यह दिखाने के लिए कि यदि यह कैसे काम कर रहा है, इस बारे में अधिक स्पष्टता के लिए एक बयान में यह कैसे दिखेगा।

if($person->middleName ?? false) {
    echo $person->middleName;
} else {
    echo 'Person does not have a middle name';
}

व्याख्या

किसी चीज़ के अस्तित्व की जाँच करने का पारंपरिक PHP तरीका है:

if(isset($person->middleName)) {
    echo $person->middleName;
} else {
    echo 'Person does not have a middle name';
}

या अधिक विशिष्ट वर्ग के लिए:

if(property_exists($person, 'middleName')) {
    echo $person->middleName;
} else {
    echo 'Person does not have a middle name';
}

ये दोनों लंबे बयानों में ठीक हैं लेकिन तीखे बयानों में वे अनावश्यक रूप से बोझिल हो जाते हैं:

isset($person->middleName) ? echo $person->middleName : echo 'Person does not have a middle name';

आप भी इसे प्राप्त कर सकते हैं जैसे कि केवल टर्नरी ऑपरेटर के साथ:

echo $person->middleName ?: 'Person does not have a middle name';

लेकिन ... यदि मान मौजूद नहीं है (सेट नहीं है) तो यह एक वृद्धि करेगा E_NOTICEऔर सबसे अच्छा अभ्यास नहीं है। यदि मान है nullतो वह अपवाद नहीं बढ़ाएगा।

इसलिए बचावकर्ता को यह एक छोटा सा जवाब देने वाला टर्नरी ऑपरेटर:

echo $person->middleName ?? 'Person does not have a middle name';


महान व्याख्या!
दासबेन

4

यदि आप यह जानना चाहते हैं कि क्या कोई संपत्ति उस वर्ग के उदाहरण में मौजूद है जिसे आपने परिभाषित किया है, तो बस property_exists()साथ दें isset()

public function hasProperty($property)
{
    return property_exists($this, $property) && isset($this->$property);
}

1
कॉलिंग property_exists($this, $property)यहां बेमानी है, क्योंकि आपके कोड में हमेशा वही परिणाम होगा जो isset($this->$property)अकेले है।
MarthM

यह तथ्यों की एक अधिक पूर्ण परीक्षा है क्योंकि आपको isset()यह नहीं बता सकता है कि क्या कोई संपत्ति वर्ग परिभाषा का सच्चा सदस्य है। मैं यह सुनिश्चित करने के लिए बाद में फिर से देखूंगा।
एंथनी रटलेज

यह सच है, आउटपुट वास्तविक वर्ग गुणों के लिए समान होगा। यदि आपके पास आभासी गुण हैं __get()और अधिक महत्वपूर्ण रूप से __isset()जादू के तरीके हैं, तो आउटपुट कुछ मामलों में अलग होगा।
शाम 5 बजे

1

यह जाँचने के लिए कि क्या कुछ बाहर निकलता है, आप PHP फंक्शन isset () php.net देखें का उपयोग कर सकते हैं । यह फ़ंक्शन जाँच करेगा कि क्या चर सेट है और NULL नहीं है।

उदाहरण:

if(isset($obj->a))
{ 
  //do something
}

यदि आपको यह जांचने की आवश्यकता है कि क्या कोई संपत्ति किसी वर्ग में मौजूद है, तो आप बिल्ड का उपयोग कर सकते हैं फ़ंक्शन property_exists ()

उदाहरण:

if (property_exists('class', $property)) {
    //do something
}

1

ऑब्जेक्ट्स पर array_key_exists () का उपयोग करना php 7.4 में डिप्रेस्ड है

इसके बजाय या तो शुरुआत () या प्रॉपर्टी_एक्सिस्ट () का उपयोग किया जाना चाहिए

संदर्भ: php.net


0

बस अपने 2 सेंट यहाँ लगा रहा हूँ।

निम्नलिखित वर्ग को देखते हुए:

class Foo
{
  private $data;

  public function __construct(array $data)
  {
    $this->data = $data;
  }

  public function __get($name)
  {
    return $data[$name];
  }

  public function __isset($name)
  {
    return array_key_exists($name, $this->data);
  }
}

निम्नलिखित होगा:

$foo = new Foo(['key' => 'value', 'bar' => null]);

var_dump(property_exists($foo, 'key'));  // false
var_dump(isset($foo->key));  // true
var_dump(property_exists($foo, 'bar'));  // false
var_dump(isset($foo->bar));  // true, although $data['bar'] == null

आशा है कि यह किसी की मदद करेगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.