PHP 8.3.0 RC 6 available for testing

property_exists

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

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

说明

property_exists(object|string $object_or_class, string $property): bool

本函数检查给出的 property 是否存在于指定的类中。

注意:

isset() 的区别是即使属性的值为 nullproperty_exists() 也会返回 true

参数

object_or_class

需要检查的类名或者类的对象

property

属性的名称

返回值

如果属性存在则返回 true,不存在则返回 false。如果发生错误则返回 null

示例

示例 #1 property_exists() 示例

<?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
var_dump(property_exists('myClass', 'bar')); //false
var_dump(property_exists('myClass', 'test')); //true
myClass::test();

?>

注释

注意:

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

注意:

property_exists() 函数不能检查通过 __get 魔术方法访问的属性。

参见

add a note

User Contributed Notes 12 notes

up
70
g dot gentile at parentesigraffe dot com
8 years ago
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()
up
25
Stefan W
10 years ago
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
?>
up
15
Nanhe Kumar
9 years ago
<?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
?>
up
5
ewisuri [gmail]
9 years ago
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
up
3
saurabh dot agarwal89 at gmail dot com
8 years ago
$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)
up
0
biziclop
8 days ago
I needed a method for finding out if accessing a property outside a class is possible without errors/warnings, considering that the class might use the magic methods __isset/__get to simulate nonexistent properties.

<?php
// returns true if property is safely accessible publicly by using $obj->$prop
// Tested with PHP 5.1 - 8.2, see https://3v4l.org/QBTd1
function public_property_exists( $obj, $prop ){
// allow magic $obj->__isset( $prop ) to execute if exists
if( isset( $obj->$prop )) return true;

// no public/protected/private property exists with this name
if( ! property_exists( $obj, $prop )) return false;

// the property exists, but is it public?
$rp = new ReflectionProperty( $obj, $prop );
return
$rp->isPublic();
}

//// Test/demo
class C {
public
$public = "I’m public!";
protected
$protected = "I’m public!";
private
$private = "I’m public!";
function
__isset( $k ){
return
substr( $k, 0, 5 ) === 'magic';
}
function
__get( $k ){
if(
$k === 'magic_isset_but_null') return null;
return
"I’m {$k}!";
}
}

$o = new C();
foreach( array(
'public', 'protected', 'private',
'magic', 'magic_isset_but_null',
'missing'
) as $prop ){
if(
public_property_exists( $o, $prop ))
echo
"\$o->{$prop} is a public property, its value is: ",
var_export( $o->$prop, true ), "\n";
else echo
"\$o->{$prop} is not a public property.\n";
}
/*
$o->public is a public property, its value is: 'I’m public!'
$o->protected is not a public property.
$o->private is not a public property.
$o->magic is a public property, its value is: 'I’m magic!'
$o->magic_isset_but_null is a public property, its value is: NULL
$o->missing is not a public property.
*/
up
0
anonymous
18 days ago
Be wary if you're checking for nested properties. This function returns true for null values. If you're not checking for null, you will throw a fatal error if you then try to pass a property that exists, but equals null into the first argument.
up
0
rnealxp at yahoo dot com
3 years ago
For class constants, use defined() to check for their existence since property_exists() cannot be used.
<?php
class A{
private static
$c = 'C';
const
B = 'B';
}
if(
property_exists('A','c')===true){
echo
'y';
}else{
echo
'n';
}
//output: y
if(property_exists('A','B')===true){
echo
'y';
}else{
echo
'n';
}
//output: n
if(defined('A::B')===true){
echo
'y';
}else{
echo
'n';
}
//output: y
?>
up
0
@fitorec
4 years ago
<?php

abstract class P {
private
$priv;
static protected
$static_prop;
static function
exists($prop = 'priv') {
var_dump(property_exists(new static, $prop)); //true
}
}

class
S extends P {
static protected
$new_prop;
}
S::exists('new_prop'); // True
S::exists('static_prop'); // True
S::exists('priv'); // True
up
-1
falundir at gmail dot com
6 years ago
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
?>
up
-3
Daniel dot Peder at infoset dot com
6 years ago
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)

*/
up
-12
David Spector
5 years ago
Just to clarify, property_exists only works for static properties. There is no corresponding const_exists function in PHP to do something similar for const names.
To Top