Note that before PHP 5.3.3, this function fails for private properties in base classes (which is fixed in 5.3.3)
<?php
class Base {
private $var = 1;
public function test() {
var_dump( property_exists( $this, 'var' ) );
}
}
class Derived extends Base {
}
$b = new Base();
$b->test();
$d = new Derived();
$d->test();
?>
Executing this code with PHP 5.0 <= x < 5.3 this script echoes (incorrect result):
bool(true)
bool(false)
Executing this code with PHP 5.3 this script echoes (correct result):
bool(true)
bool(true)
property_exists
(PHP 5 >= 5.1.0)
property_exists — Prüft auf die Existenz einer Eigenschaft eiens Objektes bzw. einer Klasse
Beschreibung
Prüft ob die Eigenschaft property in der angegebenen Klasse existiert.
Hinweis:
Anders als isset() gibt property_exists() auch dann TRUE zurück wenn eine Eigenschaft den Wert NULL hat.
Parameter-Liste
- class
-
Objektinstanz oder Name einer Klasse.
- property
-
Name der zu prüfenden Eigenschaft.
Rückgabewerte
Gibt TRUE zurück wenn die Eigenschaft existiert, FALSE wenn nicht, und NULL im Fehlerfall.
Anmerkungen
Hinweis:
Die Verwendung dieser Funktion wird jegliche registrierte Autoloader verwenden, falls die Klasse nicht bereits bekannt ist.
Hinweis:
Die property_exists() Funktion kann keine Eigenschaften erkennen die über die 'magische' Methode __get implementiert sind.
Changelog
| Version | Beschreibung |
|---|---|
| 5.3.0 | Die Funktion prüft auf die Existenz der Eigenschaft unabhängig von den Zugriffsberechtigungen. |
Beispiele
Beispiel #1 Ein property_exists() Beispiel
<?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 ab PHP 5.3.0
var_dump(property_exists('myClass', 'bar')); //false
var_dump(property_exists('myClass', 'test')); //true ab PHP 5.3.0
myClass::test();
?>
According to my tests, isset() is 4 times faster than property_exists(), so use a combination of these functions in your programming for best performance.
For example:
<?php
$fld = 'somevar';
if (isset($this->$fld) || property_exists($this, $fld)) {
}
?>
If your programming routinely checks a larger number of property names that are expected to exist, whereas a smaller number may not, then using isset(), as above, will result in faster execution of the programming.
The above PHP4 function did not work for me. This does:
<?php
if ( !function_exists( 'property_exists' ) ) {
function property_exists( $class, $property ) {
if ( is_object( $class ) ) {
$vars = get_object_vars( $class );
} else {
$vars = get_class_vars( $class );
}
return array_key_exists( $property, $vars );
}
}
?>
To check the existance of a property from outside the scope (even if it's not accessible) try/consider the following:
<?php
function property_exists_safe($class, $prop)
{
$r = property_exists($class, $prop);
if (!$r) {
$x = new ReflectionClass($class);
$r = $x->hasProperty($prop);
}
return $r;
}
class myClass {
public $mine;
private $xpto;
static function test1() {
// true, it can be accessed from here
var_dump(property_exists('myClass', 'xpto'));
}
static function test2() {
// true, it can be accessed from everywhere!
var_dump(property_exists_safe('myClass', 'xpto'));
}
}
var_dump(property_exists('myClass', 'mine')); //true
var_dump(property_exists(new myClass, 'mine')); //true
var_dump(property_exists('myClass', 'xpto')); //false, isn't public
myClass::test1();
echo("\n");
var_dump(property_exists_safe('myClass', 'mine')); //true
var_dump(property_exists_safe(new myClass, 'mine')); //true
var_dump(property_exists_safe('myClass', 'xpto')); //true
myClass::test2(); //true
?>
bool(true)
bool(true)
bool(false)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
A niet way to copy properties from one object to another avoiding stuff like:
$obj2 -> prop1 = $obj1 -> prop1;
$obj2 -> prop2 = $obj1 -> prop2;
$obj2 -> prop3 = $obj1 -> prop3;
...is this loop through all properties:
// copies all property values from obj1 to obj2
foreach ($obj1 as $prop_name => $prop_value)
{
if (property_exists(get_class($obj2), $prop_name))
$obj2 -> {$prop_name} = $prop_value;
}
to ssettl2 at google's mail >
1) Use self:: in static methods : http://php.net/language.oop5.static
2) Under the description title of this page : "This function checks if the given property exists in the specified class (and if it is ACCESSIBLE FROM THE CURRENT SCOPE)."
This is normal behaviour in PHP5.
Regards
This function is case-sensitive, so :
<?php
class Test {
public $property;
public foo() { echo($property); }
}
property_exists('Test', 'property'); // will return true
property_exists('Test', 'Property'); // will return false
?>
(under PHP5.1.2)
The documentation leaves out the important case of new properties you add to objects at run time. In fact, property_exists will return true if you ask it about such properties.
<?
class Y {}
$y = new Y;
echo isset( $y->prop ) ? "yes\n" : "no\n"; // no;
echo property_exists( 'Y', 'prop' ) ? "yes\n" : "no\n"; // no
echo property_exists( $y, 'prop' ) ? "yes\n" : "no\n"; // no
$y->prop = null;
echo isset( $y->prop ) ? "yes\n" : "no\n"; // no;
echo property_exists( 'Y', 'prop' ) ? "yes\n" : "no\n"; // no
echo property_exists( $y, 'prop' ) ? "yes\n" : "no\n"; // yes
?>
In a similar vein to the previous note, To check in PHP4 if an object has a property, even if the property is null:
<?php
if(array_key_exists('propertyName',get_object_vars($myObj)))
{
// ..the property has been defined
}
?>
I haven't tested this with the exact function semantics of 5.1, but this code should implement this function in php < 5.1:
<?php
if (!function_exists('property_exists')) {
function property_exists($class, $property) {
if (is_object($class))
$class = get_class($class);
return array_key_exists($property, get_class_vars($class));
}
}
?>
