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() 相反,property_exists() 即使属性的值为 null,也会返回 true

参数

object_or_class

要测试的类的类名或类对象

property

属性的名称

返回值

如果属性存在,则返回 true,如果不存在,则返回 false

示例

示例 #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();

?>

注释

注意:

使用此函数将使用任何已注册的 自动加载器(如果类尚未被识别)。

注意:

property_exists() 函数无法检测使用 __get 魔术方法进行神奇访问的属性。

参见

添加注释

用户贡献的注释 6 个注释

68
g dot gentile at parentesigraffe dot com
9 年前
该函数的行为取决于属性是在类声明中存在还是动态添加,如果变量已被 unset()。

<?php

class TestClass {

public
$declared = null;

}

$testObject = new TestClass;

var_dump(property_exists("TestClass", "dynamic")); // 布尔值 false,符合预期
var_dump(property_exists($testObject, "dynamic")); // 布尔值 false,与上面相同

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

unset($testObject->dynamic);
var_dump(property_exists($testObject, "dynamic")); // 布尔值 false,再次。

var_dump(property_exists($testObject, "declared")); // 布尔值 true,符合预期

unset($testObject->declared);
var_dump(property_exists($testObject, "declared")); // 布尔值 true,即使已被 unset()
26
Stefan W
10 年前
如果您在命名空间文件中,并且要将类名作为字符串传递,则必须包含类的完整命名空间 - 即使来自同一个命名空间内部。

<?
namespace MyNS;

class A {
public $foo;
}

property_exists("A", "foo"); // false
property_exists("\\MyNS\\A", "foo"); // true
?>
14
Nanhe Kumar
10 年前
<?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('[email protected]');
echo
$s->getName(); //Nanhe Kumar
echo $s->getEmail(); // [email protected]
$s->setAge(10); //Undefined Property
?>
6
ewisuri [gmail]
10 年前
从 PHP 5.3.0 开始,从父类调用 property_exists 会看到子类中的私有属性。

<?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, 从 PHP 5.3.0 开始
4
saurabh dot agarwal89 at gmail dot com
9 年前
$a = array('a','b'=>'c');
print_r((object) $a);
var_dump( property_exists((object) $a,'0'));
var_dump( property_exists((object) $a,'b'));

输出
stdClass Object
(
[0] => a
[b] => c
)
bool(false)
bool(true)
-2
biziclop
9 个月前
我需要一种方法来判断在类外部访问属性是否会发生错误/警告,考虑到类可能使用 __isset/__get 魔术方法来模拟不存在的属性。

<?php
// 如果属性可以通过 $obj->$prop 安全地公开访问,则返回 true
// 已在 PHP 5.1 - 8.2 上测试,请参见 https://3v4l.org/QBTd1
function public_property_exists( $obj, $prop ){
// 如果存在,允许 $obj->__isset( $prop ) 执行
if( isset( $obj->$prop )) return true;

// 不存在具有此名称的公有/受保护/私有属性
if( ! property_exists( $obj, $prop )) return false;

// 属性存在,但它是公有的吗?
$rp = new ReflectionProperty( $obj, $prop );
return
$rp->isPublic();
}

//// 测试/演示
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.
*/
To Top