Как я могу перебрать закрытые поля класса, не имея его экземпляра, а просто имя класса?
get_object_vars
требует существующего экземпляра.
С помощью: ReflectionClass
Вы можете просто сделать:
class Foo
{
public $public = 1;
protected $protected = 2;
private $private = 3;
}
$refClass = new \ReflectionClass('Foo');
foreach ($refClass->getProperties() as $refProperty) {
if ($refProperty->isPrivate()) {
echo $refProperty->getName(), "\n";
}
}
или скрыть реализацию, используя служебную функцию / метод:
/**
* @param string $class
* @return \ReflectionProperty[]
*/
function getPrivateProperties($class)
{
$result = [];
$refClass = new \ReflectionClass($class);
foreach ($refClass->getProperties() as $refProperty) {
if ($refProperty->isPrivate()) {
$result[] = $refProperty;
}
}
return $result;
}
print_r(getPrivateProperties('Foo'));
// Array
// (
// [0] => ReflectionProperty Object
// (
// [name] => private
// [class] => Foo
// )
//
// )
Других решений пока нет …