property_exists

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

property_exists オブジェクトもしくはクラスにプロパティが存在するかどうかを調べる

説明

property_exists(object|string $object_or_class, string $property): bool

この関数は、与えられたプロパティ property が 指定されたクラスに存在するかどうかを確認します。

注意:

isset() とは対照的に、 プロパティの値が null の場合でも property_exists()true を返します。

パラメータ

object_or_class

確認するクラス名、もしくはクラスのオブジェクトを指定します。

property

プロパティ名を指定します。

戻り値

プロパティが存在している場合は true、存在していない場合に false を返します。

例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')); //true
var_dump(property_exists('myClass', 'bar')); //false
var_dump(property_exists('myClass', 'test')); //true
myClass::test();

?>

注意

注意:

この関数を使うと、未知のクラスに対しては登録済みの autoloader を使用します。

注意:

property_exists() 関数は、マジックメソッド __get を使ってアクセスするプロパティを検出することはできません。

参考

  • method_exists() - クラスメソッドが存在するかどうかを確認する

add a note

User Contributed Notes 6 notes

up
69
g dot gentile at parentesigraffe dot com
10 years ago
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()<?phpclass TestClass {    public $declared = null;    }$testObject = new TestClass;var_dump(property_exists("TestClass", "dynamic")); // boolean false, as expectedvar_dump(property_exists($testObject, "dynamic")); // boolean false, same as above$testObject->dynamic = null;var_dump(property_exists($testObject, "dynamic")); // boolean trueunset($testObject->dynamic);var_dump(property_exists($testObject, "dynamic")); // boolean false, again.var_dump(property_exists($testObject, "declared")); // boolean true, as espectedunset($testObject->declared);var_dump(property_exists($testObject, "declared")); // boolean true, even if has been unset()
up
25
Stefan W
11 years ago
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");          // falseproperty_exists("\\MyNS\\A", "foo");  // true?>
up
14
Nanhe Kumar
11 years ago
<?phpclass 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 Kumarecho $s->getEmail(); // nanhe.kumar@gmail.com$s->setAge(10); //Undefined Property?>
up
5
ewisuri [gmail]
11 years ago
As of PHP 5.3.0, calling property_exists from a parent class sees private properties in sub-classes.<?phpclass 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
up
4
saurabh dot agarwal89 at gmail dot com
10 years ago
$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)
up
-1
biziclop
1 year ago
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/QBTd1function 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/democlass 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.*/
To Top