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)
property_exists
(PHP 5 >= 5.1.0)
property_exists — オブジェクトもしくはクラスにプロパティが存在するかどうかを調べる
説明
この関数は、与えられたプロパティ property が
指定されたクラスに存在するかどうかを確認します。
注意:
isset() とは対照的に、 プロパティの値が
NULLの場合でも property_exists() はTRUEを返します。
パラメータ
-
class -
確認するクラス名、もしくはクラスのオブジェクトを指定します。
-
property -
プロパティ名を指定します。
返り値
プロパティが存在している場合は TRUE、存在していない場合に FALSE、
エラー時には NULL を返します。
注意
注意:
この関数を使うと、未知のクラスに対しては登録済みの autoloader を使用します。
注意:
property_exists() 関数は、マジックメソッド __get を使ってアクセスするプロパティを検出することはできません。
変更履歴
| バージョン | 説明 |
|---|---|
| 5.3.0 | この関数は、アクセス権に依存せずにプロパティの存在確認を行うようになりました。 |
例
例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')); //PHP 5.3.0 以降では true
var_dump(property_exists('myClass', 'bar')); //false
var_dump(property_exists('myClass', 'test')); //PHP 5.3.0 以降では true
myClass::test();
?>
Alan71 ¶
6 years ago
webmaster at thedigitalorchard dot ca ¶
3 years ago
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.
rayro at gmx dot de ¶
5 years ago
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)
jcaplan at bogus dot amazon dot com ¶
6 years ago
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.
<?php
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
?>
timshel ¶
7 years ago
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));
}
}
?>
