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时,我们说属性不是变量,就像我们说方法而不是函数一样。
Christopher Bonitz

Answers:


254

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

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

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

if (isset($ob->a))

如果属性为null,则isset()将返回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()相反,即使属性的值为NULL,property_exists()也会返回TRUE。

bool property_exists(混合$ class,字符串$ property)

例:

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

7
这应该标记为已接受答案,因为它可以非常精确地回答显式答案。isset对于测试对象中属性的存在不是很有用。
克里斯托弗·博尼兹

11

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

property_exist +未设置的属性可能会导致错误的行为。这似乎是最安全的方法
清忠

array_key_exists()在PHP 7.4中已弃用
Ali_Hr

“不赞成在对象上使用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';
}

这些在长格式语句中都很好,但是在三元语句中,它们变得不必要地麻烦,例如:

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

如果您想知道已定义的类的实例中是否存在属性,只需property_exists()与组合isset()

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

1
property_exists($this, $property)这里的调用是多余的,因为您的代码将始终具有与isset($this->$property)单独代码相同的结果。
MarthyM

这是对事实的更完整的检查,因为isset()无法告诉您属性是否是类定义的真实成员。稍后我会再次查找以确保。
安东尼·鲁特里奇

的确如此,实际类属性的输出将相同。如果您具有使用魔术方法(__get()更重要的是__isset()魔术方法)的虚拟属性,则在某些情况下输出将有所不同。
MarthyM '17

1

要检查是否存在退出,可以使用PHP函数isset()参见php.net。此函数将检查变量是否已设置并且不为NULL。

例:

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

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

例:

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

1

在php 7.4中不推荐在对象上使用array_key_exists()

相反,应该使用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

希望这会帮助任何人

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.