200

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

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

また

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

JSでは、これを記述して、変数aがオブジェクトに存在するかどうかを確認できます。

if ('a' in ob)

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

4

9 に答える 9

339

property_exists(mixed $ class、string $ property)

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

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

プロパティがnullの場合、isset()はfalseを返すことに注意してください

if (isset($ob->a))

例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
于 2013-01-19T12:32:10.450 に答える
73

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

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

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

bool property_exists(mixed $ class、string $ property)

例:

if (property_exists($testObject, $property)) {
    //do something
}
于 2015-03-10T11:08:36.070 に答える
16

issetproperty_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
        }
    }
于 2017-06-08T18:12:04.507 に答える
14

解決

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

于 2019-03-20T05:25:10.773 に答える
4

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

public function hasProperty($property)
{
    return property_exists($this, $property) && isset($this->$property);
}
于 2017-07-17T19:17:55.737 に答える
2

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

例:

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

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

例:

if (property_exists('class', $property)) {
    //do something
}
于 2013-01-19T12:35:29.410 に答える
2

オブジェクトでのarray_key_exists()の使用は、php7.4では非推奨になりました

代わりに、isset()またはproperty_exists()のいずれかを使用する必要があります

参照:php.net

于 2019-12-15T08:43:39.250 に答える
2

通常、私は一種のカスタムヘルパーを使用します

    /**
     * @param Object $object
     * @param string $property as a string with nested properties 'prop1.nesterdProp.deepvalue'
     * @param mixed $default
     * @return mixed
     */
    function getPropertyOrDefault(Object $object, string $property, $default = null)
    {
        $value = $object;
        $path = explode('.', $property);
        foreach ($path as $prop) {
            if (is_object($value) && property_exists($value, $prop)) {
                $value = $value->{$prop};
            } else {
                return $default;
            }
        }
        return $value;
    }

プロパティが空の場合、空の値が取得され、デフォルト値は取得されないことに注意してください。

ところで、同様のヘルパーはJSでも機能します。

于 2021-03-31T21:42:19.387 に答える
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

これが誰かに役立つことを願っています

于 2020-01-31T07:05:33.090 に答える