web-dev-qa-db-ja.com

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

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

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

または

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

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

if ('a' in ob)

PHP、では、このようなことができますか?

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

115
Micah

property_exists(mixed $ class、string $ property)

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

isset(mixed $ var [、mixed $ ...])

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
181
Peter

プロパティが存在するかどうか、またプロパティが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
}
56
Chiara Perino

issetまたはproperty_existsのどちらでも機能しません。

  • issetは、プロパティは存在するがNULLの場合は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
        }
    }
11
smariot

定義したクラスのインスタンスにプロパティが存在するかどうかを知りたい場合は、property_exists()isset()を組み合わせてください。

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

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

OR

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

4
Rob

何かが終了するかどうかを確認するには、PHP関数isset() php.netを参照 を使用できます。この関数は、変数が設定されていてNULLでないかどうかを確認します。

例:

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

クラスにプロパティが存在するかどうかを確認する必要がある場合は、ビルドイン関数 property_exists() を使用できます

例:

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