property_exists
(PHP 5 >= 5.1.0)
property_exists — Checks if the object or class has a property
Description
This function checks if the given property
exists in
the specified class.
Note:
As opposed with isset(), property_exists() returns
TRUE
even if the property has the valueNULL
.
Parameters
-
class
-
The class name or an object of the class to test for
-
property
-
The name of the property
Return Values
Returns TRUE
if the property exists, FALSE
if it doesn't exist or
NULL
in case of an error.
Notes
Note:
Using this function will use any registered autoloaders if the class is not already known.
Note:
The property_exists() function cannot detect properties that are magically accessible using the __get magic method.
Changelog
Version | Description |
---|---|
5.3.0 | This function checks the existence of a property independent of accessibility. |
Examples
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();
?>
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения, относящиеся к переменным и типам
- Функции работы с классами и объектами
- __autoload
- call_user_method_array
- call_user_method
- class_alias
- class_exists
- get_called_class
- get_class_methods
- get_class_vars
- get_class
- get_declared_classes
- get_declared_interfaces
- get_declared_traits
- get_object_vars
- get_parent_class
- interface_exists
- is_a
- is_subclass_of
- method_exists
- property_exists
- trait_exists
Коментарии
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
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()
$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)
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.
*/