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


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.