• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • ReflectionClass::getDefaultProperties()

    (PHP 5, PHP 7)

    获取默认属性

    说明

    publicReflectionClass::getDefaultProperties(void): array

    获取类的默认属性(包括了继承的属性)。

    Note:

    This method only works for static properties when used on internal classes. The default value of a static class property can not be tracked when using this method on user defined classes.

    参数

    此函数没有参数。

    返回值

    默认属性的数组,其键是属性的名称,其值是属性的默认值或者在属性没有默认值时是NULL。这个函数不区分静态和非静态属性,也不考虑可见性修饰符。

    范例

    Example #1ReflectionClass::getDefaultProperties()例子

    <?php
    class Bar {
        protected $inheritedProperty = 'inheritedDefault';
    }
    class Foo extends Bar {
        public $property = 'propertyDefault';
        private $privateProperty = 'privatePropertyDefault';
        public static $staticProperty = 'staticProperty';
        public $defaultlessProperty;
    }
    $reflectionClass = new ReflectionClass('Foo');
    var_dump($reflectionClass->getDefaultProperties());
    ?>
    

    以上例程会输出:

    array(5) {
       ["staticProperty"]=>
       string(14) "staticProperty"
       ["property"]=>
       string(15) "propertyDefault"
       ["privateProperty"]=>
       string(22) "privatePropertyDefault"
       ["defaultlessProperty"]=>
       NULL
       ["inheritedProperty"]=>
       string(16) "inheritedDefault"
    }
    

    参见

    • ReflectionClass::getProperties() 获取一组属性
    • ReflectionClass::getStaticProperties() 获取静态(static)属性
    • ReflectionClass::getProperty() 获取类的一个属性的 ReflectionProperty
    runaurufu is not quite right, get_class_vars() does not return protected params, while this one does.
    Thus it's extremely useful when having an abstract parent class and protected properties overriding in children.
    For example, I use a class factory and one of the children has some static test methods that still need to output a paramether name, like $this->name, etc. With this example code, one can use static::getNotStaticProperty('name'), but not get_class_vars('name').
    Try it:
    trait static_reflector {
      /*
       * a purely static function that returns default properties of the non-static instance of the same class
       */
      static protected function getNonStaticProperty($key) {
        $me = get_class();
        $reflectionClass = new \ReflectionClass($me);
        $properties_list = $reflectionClass->getDefaultProperties();
        if (isset($properties_list[$key]))
          return $var_name = $properties_list[$key];
        else throw new RuntimeException("BUG: Unable to reflect non-static property '{$key}' from default properties of class {$me}");
      }
    }
    class a {
      use \static_reflector;
      protected $key_a = 'test ok';
      public static function test() {
        echo static::getNonStaticProperty('key_a')."\n";
        try {
          print static::getNonStaticProperty('key_b');
          echo "FAIL No exception thrown";
        } catch (RuntimeException $e) {
          echo "OK ".$e->getMessage();
        }
      }
    }
    echo get_class_vars('a')['key_a']; 
    a::test();
    this will return:
    Notice: Undefined index: key_a in ...
    test ok
    OK BUG: Unable to reflect non-static property 'key_b' from default properties of class a
    ps: Yes, this is copied from a unit test.
    Worth noting that it will not return private parameters of parent class...
    so it works exactly as get_class_vars or get_object_vars
    This will return all properties in a class and any parent classes. The array will have keys set to the property names and empty values.