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( 混合 $class , string $property )

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

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

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

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

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

与 isset() 不同,property_exists() 会返回 TRUE,即使该属性的值为 NULL。

bool property_exists ( 混合 $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';
}

这些在长格式语句中都很好,但在三元语句中它们变得不必要的麻烦,如下所示:

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

通常我使用一种自定义助手

    /**
     * @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 回答
2

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

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

参考:php.net

于 2019-12-15T08:43:39.250 回答
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 回答