property_exists()
(PHP 5 >= 5.1.0, PHP 7)
检查对象或类是否具有该属性
说明
property_exists(mixed $class,string $property): bool
本函数检查给出的$property是否存在于指定的类中(以及是否能在当前范围内访问)。
Note:As opposed withisset(),property_exists()returns
TRUEeven if the property has the valueNULL.
参数
- $class
字符串形式的类名或要检查的类的一个对象
- $property
属性的名字
返回值
如果该属性存在则返回TRUE,如果不存在则返回FALSE,出错返回NULL。
注释
Note:如果此类不是已知类,使用此函数会使用任何已注册的autoloader。
Note:Theproperty_exists()function cannot detect properties that are magically accessible using the__getmagic method.
更新日志
| 版本 | 说明 |
|---|---|
| 5.3.0 | This function checks the existence of a property independent of accessibility. |
范例
Aproperty_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();
?>
参见
method_exists()检查类的方法是否存在
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()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
?>
<?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
?>
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$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)
<?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'); // TrueIf 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
?>
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)
*/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.
