©
This document uses PHP Chinese website manual Release
(PHP 5 >= 5.1.0, PHP 7)
property_exists — 检查对象或类是否具有该属性
$class
, string $property
)
本函数检查给出的 property
是否存在于指定的类中(以及是否能在当前范围内访问)。
Note:
As opposed with isset() , property_exists() returns
TRUE
even if the property has the valueNULL
.
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 ();
?>
[#1] saurabh dot agarwal89 at gmail dot com [2015-05-27 11:17:45]
$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)
[#2] g dot gentile at parentesigraffe dot com [2015-03-05 09:02:31]
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()
[#3] ewisuri [gmail] [2014-02-15 04:37:43]
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
[#4] berimbolo [2014-02-02 13:44:01]
When you are testing for a property that has been added dynamically, you will need to provide a reference to the instance rather than the class name for the first parameter.
For example, for this code snippet:
class myClass {
public $var;
}
$obj = new myClass;
$obj->new_var = "new";
var_dump(property_exists('myClass', 'new_var') );
var_dump(property_exists($obj, 'new_var') );
Returns:
boolean false
boolean true
[#5] Nanhe Kumar [2014-01-17 22:39:11]
<?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
?>
[#6] Stefan W [2013-09-03 01:23:03]
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:
<?php
namespace MyNS;
class A {
public $foo;
}
property_exists("A", "foo"); // false
property_exists("\\MyNS\\A", "foo"); // true
?>