ReflectionClass::getDefaultProperties

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getDefaultProperties获取默认属性

描述

public ReflectionClass::getDefaultProperties(): array

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

注意:

此方法仅在内部类上使用时才适用于静态属性。在用户定义的类上使用此方法时,无法跟踪静态类属性的默认值。

参数

此函数没有参数。

返回值

一个 array,包含默认属性,键为属性名,值为属性的默认值或 null(如果属性没有默认值)。此函数不区分静态属性和非静态属性,也不考虑可见性修饰符。

示例

示例 #1 ReflectionClass::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"
}

参见

添加笔记

用户贡献笔记 3 笔记

articice at ua dot fm
8 年前
runaurufu 的说法并不完全正确,get_class_vars() 不会返回受保护的参数,而此方法会。

因此,当具有抽象父类和在子类中重写的受保护属性时,它非常有用。
例如,我使用类工厂,其中一个子类有一些静态测试方法,仍然需要输出参数名,例如 $this->name 等。使用此示例代码,可以使用 static::getNotStaticProperty('name'),但不能使用 get_class_vars('name')。

试试看

trait static_reflector {
/*
* 一个纯粹的静态函数,返回同一类的非静态实例的默认属性
*/
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: 无法从类 {$me} 的默认属性中反映非静态属性 '{$key}'");
}
}

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 未抛出异常";
} catch (RuntimeException $e) {
echo "OK ".$e->getMessage();
}

}
}

echo get_class_vars('a')['key_a'];
a::test();

这将返回
Notice: Undefined index: key_a in ...
test ok
OK BUG: 无法从类 a 的默认属性中反映非静态属性 'key_b'

ps: 是的,这是从单元测试中复制的。
runaurufu AT gmail.com
13 年前
值得注意的是,它不会返回父类的私有参数...
因此它的工作方式与 get_class_vars 或 get_object_vars 完全相同
captainjester at hotmail dot com
14 年前
这将返回类及其所有父类中的所有属性。数组将使用属性名作为键,并具有空值。
To Top