• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • property_exists()

    (PHP 5 >= 5.1.0, PHP 7)

    检查对象或类是否具有该属性

    说明

    property_exists(mixed $class,string $property): bool

    本函数检查给出的$property是否存在于指定的类中(以及是否能在当前范围内访问)。

    Note:

    As opposed withisset(),property_exists()returnsTRUEeven if the property has the valueNULL.

    参数

    $class

    字符串形式的类名或要检查的类的一个对象

    $property

    属性的名字

    返回值

    如果该属性存在则返回TRUE,如果不存在则返回FALSE,出错返回NULL

    注释

    Note:

    如果此类不是已知类,使用此函数会使用任何已注册的autoloader。

    Note:

    Theproperty_exists()function cannot detect properties that are magically accessible using the__getmagic method.

    更新日志

    版本说明
    5.3.0This function checks the existence of a property independent of accessibility.

    范例

    Aproperty_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();
    ?>
    

    参见

    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()
    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
    $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)
    <?php
    abstract class P {
     private $priv;
     static protected $static_prop;
     static function exists($prop = 'priv') {
       var_dump(property_exists(new static, $prop)); //true
     }
    }
    class S extends P {
     static protected $new_prop;
    }
    S::exists('new_prop');    // True
    S::exists('static_prop');  // True
    S::exists('priv');      // True
    If you want to test if declared *public* property was unset, you can use the following code:
    <?php
    class A {
      public $declared;
    }
    $a = new A();
    $is_defined = array_key_exists('declared', (array)$a); //=>true
    unset($a->declared);
    $is_defined = array_key_exists('declared', (array)$a); //=>false
    ?>
    
    declared properties cannot be unset
    any set property does exist, even being set to null, regardless how it was set
    <?php
    class demo_property_exists {
      public $my_public;
      protected $my_protected;
      private $my_private;
      function __construct() {
        $this->dumper('before-constructed');
        $this->my_constructed_int = 123;
        $this->my_constructed_null = null;
        $this->dumper('after-constructed');
      }
      public function dumper($name) {
        printf("\n[%s] dump:\n", $name);
        foreach ($this->my_checklist() as $prop) {
          printf("[%s]:\t", $prop);
          var_dump(property_exists($this, $prop));
        }
      }
      public function unset_all() {
        foreach ($this->my_checklist() as $prop) {
          unset($this->$prop);
        }
      }
      private function my_checklist() {
        return array('my_public', 'my_protected', 'my_private', 'my_constructed_int', 'my_constructed_null', 'my_assigned_int', 'my_assigned_null',);
      }
    }
    $object = new demo_property_exists();
    $object->dumper('before-assigned');
    $object->my_assigned_int = 456;
    $object->my_assigned_null = null;
    $object->dumper('after-assigned');
    $object->unset_all();
    $object->dumper('after-unset');
    /*
    results:
    [before-constructed] dump:
    [my_public]:  bool(true)
    [my_protected]: bool(true)
    [my_private]:  bool(true)
    [my_constructed_int]:  bool(false)
    [my_constructed_null]: bool(false)
    [my_assigned_int]:   bool(false)
    [my_assigned_null]:   bool(false)
    [after-constructed] dump:
    [my_public]:  bool(true)
    [my_protected]: bool(true)
    [my_private]:  bool(true)
    [my_constructed_int]:  bool(true)
    [my_constructed_null]: bool(true)
    [my_assigned_int]:   bool(false)
    [my_assigned_null]:   bool(false)
    [before-assigned] dump:
    [my_public]:  bool(true)
    [my_protected]: bool(true)
    [my_private]:  bool(true)
    [my_constructed_int]:  bool(true)
    [my_constructed_null]: bool(true)
    [my_assigned_int]:   bool(false)
    [my_assigned_null]:   bool(false)
    [after-assigned] dump:
    [my_public]:  bool(true)
    [my_protected]: bool(true)
    [my_private]:  bool(true)
    [my_constructed_int]:  bool(true)
    [my_constructed_null]: bool(true)
    [my_assigned_int]:   bool(true)
    [my_assigned_null]:   bool(true)
    [after-unset] dump:
    [my_public]:  bool(true)
    [my_protected]: bool(true)
    [my_private]:  bool(true)
    [my_constructed_int]:  bool(false)
    [my_constructed_null]: bool(false)
    [my_assigned_int]:   bool(false)
    [my_assigned_null]:   bool(false)
    */
    Just to clarify, property_exists only works for static properties. There is no corresponding const_exists function in PHP to do something similar for const names.

    上篇:method_exists()

    下篇:trait_exists()