我知道PHP没有一个纯对象变量,但我想检查属性是否在给定的对象或类中。

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

or

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

在JS中,我可以写这个来检查变量a是否存在于一个对象中:

if ('a' in ob)

在PHP中,可以做到这一点吗?


Property_exists(混合$class,字符串$property)

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

Isset (mixed $var [, mixed $…])

注意:注意,如果属性为空,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

要检查是否存在某些内容,可以使用PHP函数isset(),参见php.net。这个函数将检查变量是否已设置且不为NULL。

例子:

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

如果需要检查类中是否存在某个属性,则可以使用内建函数property_exists()

例子:

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

要检查属性是否存在,以及是否也为空,可以使用函数property_exists()。

文档:http://php.net/manual/en/function.property-exists.php

与isset()相反,即使属性值为NULL, property_exists()也会返回TRUE。

Bool类型:property_exists(混合$class,字符串$property)

例子:

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

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_exists()与isset()结合起来即可。

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

解决方案

echo $person-> middlelename ??“人没有中间名”;

为了更清楚地说明它是如何工作的,在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';
}

OR表示更具体的类:

if(property_exists($person, 'middleName')) {
    echo $person->middleName;
} else {
    echo 'Person does not have a middle name';
}

它们在长形式语句中都很好,但在三元语句中,它们变得不必要地麻烦,像这样:

收取(人- > middleName) ?echo $person-> middlelename: echo ' person没有中间名';

你也可以通过这样的三元运算符来实现:

echo $person-> midlename ?: '人没有中间名';

但是…如果该值不存在(没有设置),它将引发一个E_NOTICE,这不是最佳实践。如果值为空,则不会引发异常。

因此,三元运算符来拯救它,使它成为一个简洁的答案:

echo $person-> middlelename ??“人没有中间名”;


在php 7.4中已弃用对象上的array_key_exists()

相反,应该使用isset()或property_exists()

参考:php.net


我只是说说我的看法。

给定以下类:

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

希望这对大家有所帮助


通常我使用自定义助手

    /**
     * @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;
    }

请记住,如果属性为空,您将得到空值,没有默认值。

顺便说一下,类似的helper在JS中也可以工作。


这是非常新的,所以请确保您运行的是PHP 8:

$ob?->a

参考链接