PHPは、プロパティがオブジェクトまたはクラスに存在するかどうかを確認します


159

PHPには純粋なオブジェクト変数がないことを理解していますが、指定されたオブジェクトまたはクラスにプロパティがあるかどうかを確認したいと思います。

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

または

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

ではJS、私は変数がいるかどうかを確認するために、これを書くことができa、オブジェクトに存在します。

if ('a' in ob)

PHP、このような何かを行うことができますか?

アドバイスありがとうございます。


2
ただ言及します... OOPを実行するときは、関数ではなくメソッドのように、変数ではなくプロパティと言います。
クリストファーボニッツ2017

回答:


254

property_exists(混合$ class、文字列$ property)

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

isset(混合$ var [、混合$ ...])

if (isset($ob->a))

isset()は、プロパティがnullの場合にfalseを返します

例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
必ずしも存在しないが、プロパティは存在するが定義されていない場合、isset()はfalseを返します。us3.php.net/manual/en/types.comparisons.php
Mitchell

isset()をempty()と組み合わせて、プロパティ値の両方をチェックできます。

4
isset()は間違った答えですが、警告に気付いている場合、property_exists()よりもかなり高速です
Nico Westerdale

これempty()はより良い解決策である状況ですか?!empty($var)
b_dubb

1
@b_dubb no、空の配列、0、false、null、 ''すべてが「empty()」によってtrueを返す
Peter

61

プロパティが存在するかどうか、またnullかどうかを確認するには、関数を使用できますproperty_exists()

ドキュメント:http : //php.net/manual/en/function.property-exists.php

isset()とは異なり、property_exists()は、プロパティの値がNULLであってもTRUEを返します。

bool property_exists(混合$ class、文字列$ property)

例:

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

7
これは明示的な回答を非常に正確に回答するため、承認された回答としてマークする必要があります。issetは、オブジェクト内のプロパティの存在をテストするのには役立ちません。
クリストファーボニッツ2017

11

どちらISSETまたはproperty_existsは私のために働きます。

  • プロパティは存在するがNULLの場合、issetはfalseを返します。
  • プロパティが設定されていなくても、プロパティがオブジェクトのクラス定義の一部である場合、property_existsはtrueを返します。

私は次のように行きました:

    $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 + unset propertyはバグのある動作を引き起こす可能性があります。これが最も安全な方法のようです
Thanh Trung 2017


「オブジェクトでのarray_key_exists()の使用は非推奨」のキーワードはオブジェクトです。get_object_vars()は配列を返すので、まだ十分です。
smariot

7

解決

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

これがどのように機能するかをより明確にするために、これがifステートメントでどのように見えるかを示すため。

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';
}

これらはどちらも長い形式のステートメントでは問題ありませんが、3項ステートメントでは次のように不必要に面倒になります。

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';


素晴らしい説明!
DasBen

4

あなたはプロパティが内に存在するかどうかを知りたい場合は、インスタンスあなたが定義したクラスの、単純に組み合わせることproperty_exists()isset()

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

1
property_exists($this, $property)コードは常にisset($this->$property)単独の場合と同じ結果になるため、ここでは呼び出しは冗長です。
MarthyM 2017

isset()プロパティがクラス定義の真のメンバーであるかどうかを判断できないため、これは事実のより完全な調査です。念のため後でまた調べます。
Anthony Rutledge 2017

つまり、実際のクラスプロパティの出力は同じになります。__get()さらに重要な__isset()魔法のメソッドを持つ仮想プロパティがある場合、出力が異なる場合があります。
MarthyM 2017

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で廃止されました

代わりにisset()またはproperty_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.