(PHP 5, PHP 7, PHP 8)
ReflectionClass::getDefaultProperties — Obtiene las propiedades por defecto
Obtiene las propiedades por defecto de una clase (incluyendo las propiedades heredadas).
Nota:
Este método funciona únicamente para las propiedades estáticas cuando se utiliza en clases internas. El valor por defecto de una propiedad de clase estática no puede ser monitoreado al utilizar este método en clases definidas por el usuario.
Esta función no contiene ningún parámetro.
Un array de propiedades por defecto donde la clave es el nombre de la
propiedad y el valor es el valor por defecto de la propiedad o null
si la propiedad no tiene valor por defecto.
La función no distingue entre propiedades estáticas y no estáticas y no considera la visibilidad.
Ejemplo #1 Ejemplo con 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());
?>El ejemplo anterior mostrará:
array(5) {
["staticProperty"]=>
string(14) "staticProperty"
["property"]=>
string(15) "propertyDefault"
["privateProperty"]=>
string(22) "privatePropertyDefault"
["defaultlessProperty"]=>
NULL
["inheritedProperty"]=>
string(16) "inheritedDefault"
}
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