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 okOK BUG: Unable to reflect non-static property 'key_b' from default properties of class aps: Yes, this is copied from a unit test.