পিএইচপি সম্পত্তি বা বস্তু বা শ্রেণিতে বিদ্যমান কিনা তা পরীক্ষা করে দেখুন


159

আমি বুঝতে পারছি পিএইচপি-তে কোনও বিশুদ্ধ অবজেক্ট ভেরিয়েবল নেই, তবে আমি কোনও সম্পত্তি প্রদত্ত বস্তু বা শ্রেণিতে আছে কিনা তা যাচাই করতে চাই।

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

অথবা

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

ইন জাতীয়, আমি পরিবর্তনশীল পরীক্ষা করার জন্য এই লিখতে পারেন aএকটি বস্তু মধ্যে বিদ্যমান আছে:

if ('a' in ob)

ইন পিএইচপি, ভালো কিছু করা যেতে পারে?

আপনার পরামর্শের জন্য আপনাকে অনেক ধন্যবাদ।


2
কেবল উল্লেখ করছি ... যখন আমরা ওওপি করি, তখন আমরা সম্পত্তিটি পরিবর্তনশীল না বলে বলি, যেমন আমরা পদ্ধতি বলি, কাজ করে না।
ক্রিস্টোফার বোনিটজ

উত্তর:


254

সম্পত্তি_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/tyype.comparisons.php
মিচেল

সম্পত্তি এবং মান উভয় পরীক্ষা করার জন্য খালি () এর সাথে ইসসেট () একত্রিত হতে পারে ।

4
যদিও আইসেট () ভুল উত্তর, আপনি যদি সতর্কতা অবগত হন তবে সম্পত্তি_পরিচয়বিদদের তুলনায় এটি বেশ দ্রুত ()
নিকো ওয়েস্টারডেল

এটি কি এমন পরিস্থিতি যেখানে empty()আরও ভাল সমাধান হতে পারে? !empty($var)?
বি_ডাব্ব

1
@b_dubb না, খালি অ্যারে, 0, ভুয়া, নাল, '' সমস্ত সত্য `খালি () দ্বারা ফিরে আসবে
পিটার

61

সম্পত্তিটি বিদ্যমান কিনা তা পরীক্ষা করতে এবং এটি যদি নালাগুলি হয় তবে আপনি ফাংশনটি ব্যবহার করতে পারেন property_exists()

দস্তাবেজ: http://php.net/manual/en/function.property-exists.php

আইসেট () এর বিপরীতে, সম্পত্তি_exists () সম্পত্তির মান NULL থাকলেও সত্য প্রদান করে।

বুল সম্পত্তি_এক্সেস্ট (মিশ্র $ শ্রেণি, স্ট্রিং $ সম্পত্তি)

উদাহরণ:

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

7
এটি স্বীকৃত উত্তর হিসাবে চিহ্নিত করা উচিত কারণ এটি সুস্পষ্ট উত্তরটির খুব সুনির্দিষ্ট উত্তর দেয়। আইসেট কোনও বস্তুর কোনও সম্পত্তির অস্তিত্ব পরীক্ষা করার জন্য কার্যকর নয়।
ক্রিস্টোফার বোনিটজ

11

আইসেট বা সম্পত্তি_পরিচয় কেউই আমার পক্ষে কাজ করে না।

  • সম্পত্তি উপস্থিত থাকলেও ন্যূনাল হলে আইসেটটি মিথ্যা প্রত্যাবর্তন করে।
  • সম্পত্তিটি অ্যাক্সেস না করা সত্ত্বেও, সম্পত্তি যদি বস্তুর শ্রেণির সংজ্ঞায়নের অংশ হয় তবে সম্পত্তি প্রত্যাখ্যানকারীরা সত্য হয়।

আমি সাথে যেতে শেষ:

    $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
        }
    }

সম্পত্তি_exist + আনসেট সম্পত্তি সম্পত্তি বগী আচরণ হতে পারে। এটি সবচেয়ে নিরাপদ পদ্ধতি বলে মনে হচ্ছে
থানহ ট্রুং

অ্যারে_কি_এক্সিস্টগুলি () পিএইচপি
7.4- এ অবহিত হয়েছে

"বস্তুর উপরে অ্যারে_কি_এক্সিস্টগুলি () ব্যবহার করে" কীওয়ার্ড হ'ল অবজেক্ট। 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';
}

ব্যাখ্যা

কোনও কিছুর অস্তিত্ব যাচাই করার জন্য toতিহ্যবাহী পিএইচপি উপায়টি হ'ল:

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)একা হিসাবে একই ফলাফল রাখে ।
মার্থি

এটি তথ্যগুলির আরও সম্পূর্ণ পরীক্ষা কারণ isset()কোনও সম্পত্তি শ্রেণির সংজ্ঞাটির সত্যিকারের সদস্য কিনা তা আপনাকে বলতে পারে না। আমি নিশ্চিত হয়ে পরে আবার দেখা হবে।
অ্যান্টনি রটলেজ

এটি সত্য, প্রকৃত শ্রেণীর বৈশিষ্ট্যগুলির জন্য আউটপুট একই হবে। আপনার যদি __get()আরও গুরুত্বপূর্ণভাবে __isset()যাদু পদ্ধতিগুলির সাথে ভার্চুয়াল বৈশিষ্ট্যগুলি থাকে তবে কিছু ক্ষেত্রে আউটপুট আলাদা হবে।
মার্থিমে

1

কিছু প্রস্থান করে, আপনি পিএইচপি ফাংশন isset () ব্যবহার করতে পারেন কিনা তা চেক করতে php.net দেখতে । এই ফাংশনটি ভেরিয়েবলটি সেট করা এবং নাল নয় কিনা তা পরীক্ষা করবে।

উদাহরণ:

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

আপনার যদি কোনও শ্রেণিতে কোনও সম্পত্তি বিদ্যমান রয়েছে কিনা তা খতিয়ে দেখার প্রয়োজন হয় তবে আপনি বিল্ড ইন ফাংশন প্রপার্টি_অ্যাকজিস্ট ব্যবহার করতে পারেন ()

উদাহরণ:

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

1

বস্তুগুলিতে অ্যারে_কি_এক্সিস্টগুলি () ব্যবহার করা পিএইচপি 7.4-এ অবমানিত

পরিবর্তে হয় হয় isset () বা সম্পত্তি_exists () ব্যবহার করা উচিত

রেফারেন্স: 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

আশা করি এটি যে কাউকে সাহায্য করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.