PHP检查对象或类中是否存在属性

Mic*_*cah 128 php variables parameters class object

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

$ob = (object) array('a' => 1, 'b' => 12); 
Run Code Online (Sandbox Code Playgroud)

要么

$ob = new stdClass;
$ob->a = 1;
$ob->b = 2;
Run Code Online (Sandbox Code Playgroud)

JS中,我可以编写它来检查a对象中是否存在变量:

if ('a' in ob)
Run Code Online (Sandbox Code Playgroud)

PHP中,可以做这样的事吗?

非常感谢您的建议.

Pet*_*ter 206

property_exists(mixed $ class,string $ property)

if (property_exists($ob, 'a')) 
Run Code Online (Sandbox Code Playgroud)

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

if (isset($ob->a))
Run Code Online (Sandbox Code Playgroud)

如果property为null,则isset()将返回false

例1:

$ob->a = null
var_dump(isset($ob->a)); // false
Run Code Online (Sandbox Code Playgroud)

例2:

class Foo
{
   public $bar = null;
}

$foo = new Foo();

var_dump(property_exists($foo, 'bar')); // true
var_dump(isset($foo->bar)); // false
Run Code Online (Sandbox Code Playgroud)

  • 不一定,如果属性存在,但未定义isset()将返回false.http://us3.php.net/manual/en/types.comparisons.php (11认同)
  • 虽然isset()是错误的答案,但是如果你知道这个警告它会比property_exists()快得多 (3认同)
  • @b_dubb no、空数组、0、false、null、'' 都通过 `empty()' 返回 true (2认同)

小智 57

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

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

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

bool property_exists(混合$ class,string $ property)

例:

if (property_exists($testObject, $property)) {
    //do something
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该被标记为已接受的答案,因为它非常准确地回答了明确的答案.isset对于测试对象中是否存在属性没有用. (7认同)

sma*_*iot 11

issetproperty_exists都不适合我.

  • 如果属性存在但是为NULL,则isset返回false.
  • 如果属性是对象的类定义的一部分,则property_exists返回true,即使它已被取消设置也是如此.

我结束了:

    $exists = array_key_exists($property, get_object_vars($obj));
Run Code Online (Sandbox Code Playgroud)

例:

    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
        }
    }
Run Code Online (Sandbox Code Playgroud)


Rob*_*Rob 10

解决方案

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';
}
Run Code Online (Sandbox Code Playgroud)

解释

检查某些东西是否存在的传统 PHP 方法是:

if(isset($person->middleName)) {
    echo $person->middleName;
} else {
    echo 'Person does not have a middle name';
}
Run Code Online (Sandbox Code Playgroud)

或者更具体的方式:

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

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

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