property_exists

(PHP 5 >= 5.1.0, PHP 7)

property_exists检查对象或类是否具有该属性

说明

bool property_exists ( mixed $class , string $property )

本函数检查给出的 property 是否存在于指定的类中(以及是否能在当前范围内访问)。

Note:

As opposed with isset(), property_exists() returns TRUE even if the property has the value NULL.

参数

class

字符串形式的类名或要检查的类的一个对象

property

属性的名字

返回值

如果该属性存在则返回 TRUE,如果不存在则返回 FALSE,出错返回 NULL

注释

Note:

如果此类不是已知类,使用此函数会使用任何已注册的 autoloader

Note:

The property_exists() function cannot detect properties that are magically accessible using the __get magic method.

更新日志

版本 说明
5.3.0 This function checks the existence of a property independent of accessibility.

范例

Example #1 A property_exists() example

<?php

class myClass {
    public 
$mine;
    private 
$xpto;
    static protected 
$test;

    static function 
test() {
        
var_dump(property_exists('myClass''xpto')); //true
    
}
}

var_dump(property_exists('myClass''mine'));   //true
var_dump(property_exists(new myClass'mine')); //true
var_dump(property_exists('myClass''xpto'));   //true, as of PHP 5.3.0
var_dump(property_exists('myClass''bar'));    //false
var_dump(property_exists('myClass''test'));   //true, as of PHP 5.3.0
myClass::test();

?>

参见

User Contributed Notes

falundir at gmail dot com 17-Feb-2017 05:42
If you want to test if declared *public* property was unset, you can use the following code:

<?php
class A {
    public
$declared;
}

$a = new A();
$is_defined = array_key_exists('declared', (array)$a); //=>true

unset($a->declared);
$is_defined = array_key_exists('declared', (array)$a); //=>false
?>
Daniel dot Peder at infoset dot com 23-Nov-2016 06:24
declared properties cannot be unset
any set property does exist, even being set to null, regardless how it was set

<?php

class demo_property_exists {

    public
$my_public;
    protected
$my_protected;
    private
$my_private;

    function
__construct() {
       
$this->dumper('before-constructed');
       
$this->my_constructed_int = 123;
       
$this->my_constructed_null = null;
       
$this->dumper('after-constructed');
    }

    public function
dumper($name) {
       
printf("\n[%s] dump:\n", $name);

        foreach (
$this->my_checklist() as $prop) {
           
printf("[%s]:\t", $prop);
           
var_dump(property_exists($this, $prop));
        }
    }

    public function
unset_all() {
        foreach (
$this->my_checklist() as $prop) {
            unset(
$this->$prop);
        }
    }

    private function
my_checklist() {
        return array(
'my_public', 'my_protected', 'my_private', 'my_constructed_int', 'my_constructed_null', 'my_assigned_int', 'my_assigned_null',);
    }

}

$object = new demo_property_exists();
$object->dumper('before-assigned');
$object->my_assigned_int = 456;
$object->my_assigned_null = null;
$object->dumper('after-assigned');
$object->unset_all();
$object->dumper('after-unset');

/*
results:

[before-constructed] dump:
[my_public]:    bool(true)
[my_protected]: bool(true)
[my_private]:   bool(true)
[my_constructed_int]:   bool(false)
[my_constructed_null]:  bool(false)
[my_assigned_int]:      bool(false)
[my_assigned_null]:     bool(false)

[after-constructed] dump:
[my_public]:    bool(true)
[my_protected]: bool(true)
[my_private]:   bool(true)
[my_constructed_int]:   bool(true)
[my_constructed_null]:  bool(true)
[my_assigned_int]:      bool(false)
[my_assigned_null]:     bool(false)

[before-assigned] dump:
[my_public]:    bool(true)
[my_protected]: bool(true)
[my_private]:   bool(true)
[my_constructed_int]:   bool(true)
[my_constructed_null]:  bool(true)
[my_assigned_int]:      bool(false)
[my_assigned_null]:     bool(false)

[after-assigned] dump:
[my_public]:    bool(true)
[my_protected]: bool(true)
[my_private]:   bool(true)
[my_constructed_int]:   bool(true)
[my_constructed_null]:  bool(true)
[my_assigned_int]:      bool(true)
[my_assigned_null]:     bool(true)

[after-unset] dump:
[my_public]:    bool(true)
[my_protected]: bool(true)
[my_private]:   bool(true)
[my_constructed_int]:   bool(false)
[my_constructed_null]:  bool(false)
[my_assigned_int]:      bool(false)
[my_assigned_null]:     bool(false)

*/
saurabh dot agarwal89 at gmail dot com 27-May-2015 08:17
$a = array('a','b'=>'c');
print_r((object) $a);
var_dump( property_exists((object) $a,'0'));
var_dump( property_exists((object) $a,'b'));

OUTPUT:
stdClass Object
(
    [0] => a
    [b] => c
)
bool(false)
bool(true)
g dot gentile at parentesigraffe dot com 05-Mar-2015 06:02
The function behaves differently depending on whether the property has been present in the class declaration, or has been added dynamically, if the variable has been unset()

<?php

class TestClass {

    public
$declared = null;
   
}

$testObject = new TestClass;

var_dump(property_exists("TestClass", "dynamic")); // boolean false, as expected
var_dump(property_exists($testObject, "dynamic")); // boolean false, same as above

$testObject->dynamic = null;
var_dump(property_exists($testObject, "dynamic")); // boolean true

unset($testObject->dynamic);
var_dump(property_exists($testObject, "dynamic")); // boolean false, again.

var_dump(property_exists($testObject, "declared")); // boolean true, as espected

unset($testObject->declared);
var_dump(property_exists($testObject, "declared")); // boolean true, even if has been unset()
ewisuri [gmail] 15-Feb-2014 01:37
As of PHP 5.3.0, calling property_exists from a parent class sees private properties in sub-classes.

<?php
class P {
    public function
test_prop($prop) { return property_exists($this, $prop); }
}

class
Child extends P {
    private
$prop1;
}

$child = new Child();
var_dump($child->test_prop('prop1')); //true, as of PHP 5.3.0
Nanhe Kumar 18-Jan-2014 07:39
<?php

class Student {

    protected
$_name;
    protected
$_email;
   

    public function
__call($name, $arguments) {
       
$action = substr($name, 0, 3);
        switch (
$action) {
            case
'get':
               
$property = '_' . strtolower(substr($name, 3));
                if(
property_exists($this,$property)){
                    return
$this->{$property};
                }else{
                    echo
"Undefined Property";
                }
                break;
            case
'set':
               
$property = '_' . strtolower(substr($name, 3));
                if(
property_exists($this,$property)){
                   
$this->{$property} = $arguments[0];
                }else{
                    echo
"Undefined Property";
                }
               
                break;
            default :
                return
FALSE;
        }
    }

}

$s = new Student();
$s->setName('Nanhe Kumar');
$s->setEmail('nanhe.kumar@gmail.com');
echo
$s->getName(); //Nanhe Kumar
echo $s->getEmail(); // nanhe.kumar@gmail.com
$s->setAge(10); //Undefined Property
?>
Stefan W 03-Sep-2013 10:23
If you are in a namespaced file, and you want to pass the class name as a string, you will have to include the full namespace for the class name - even from inside the same namespace:

<?
namespace MyNS;

class A {
    public $foo;
}

property_exists("A", "foo");          // false
property_exists("\\MyNS\\A", "foo");  // true
?>