PHP Conference Nagoya 2025

ReflectionClass::getDefaultProperties

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getDefaultPropertiesВозвращает свойства по умолчанию

Описание

public ReflectionClass::getDefaultProperties(): array

Возвращает свойства класса по умолчанию (включая унаследованные свойства).

Замечание:

Этот метод работает только для статических свойств при использовании с внутренними классами. Значение по умолчанию статического свойства нельзя отслеживать в классах, определённых пользователем.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ассоциативный массив (array) свойств по умолчанию, ключами которого являются имена свойств, а значениями - соответствующие значения по умолчанию или же null, если этому свойству не было задано значение по умолчанию. Функция не различает статические и нестатические свойства, а также не предоставляет информацию о модификаторах видимости при выводе.

Примеры

Пример #1 Пример использования ReflectionClass::getDefaultProperties()

<?php
class Bar {
protected
$inheritedProperty = 'унаследованное свойство по умолчанию';
}

class
Foo extends Bar {
public
$property = 'свойство по умолчанию';
private
$privateProperty = 'закрытое свойство по умолчанию';
public static
$staticProperty = 'статическое свойство';
public
$defaultlessProperty;
}

$reflectionClass = new ReflectionClass('Foo');
var_dump($reflectionClass->getDefaultProperties());
?>

Результат выполнения приведённого примера:

array(5) {
  ["staticProperty"]=>
  string(39) "статическое свойство"
  ["property"]=>
  string(40) "свойство по умолчанию"
  ["privateProperty"]=>
  string(57) "закрытое свойство по умолчанию"
  ["defaultlessProperty"]=>
  NULL
  ["inheritedProperty"]=>
  string(69) "унаследованное свойство по умолчанию"
}

Смотрите также

Добавить

Примечания пользователей 2 notes

up
4
articice at ua dot fm
8 years ago
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.
up
2
runaurufu AT gmail.com
13 years ago
Worth noting that it will not return private parameters of parent class...
so it works exactly as get_class_vars or get_object_vars
To Top