get_object_vars只返回对象的public属性;PHP 8.1中行为不变,private/protected属性需用ReflectionClass获取,或通过__toArray()等显式方法控制导出逻辑。

get_object_vars 是 PHP 中用于获取对象**可访问(public)属性**并返回为关联数组的函数。在 PHP 8.1 中行为与之前版本一致,但它不会返回 private 或 protected 属性,除非在类内部调用(利用作用域权限)。
只获取 public 属性(最常用场景)
这是默认用法,适用于你只想导出对象对外暴露的字段:
$obj = new class {
public $name = 'Alice';
public $age = 30;
private $secret = 'hidden';
protected $role = 'user';
};
$vars = get_object_vars($obj);
print_r($vars);
// 输出:
// Array
// (
// [name] => Alice
// [age] => 30
// )
想获取所有属性(包括 private/protected)?用反射(ReflectionClass)
当需要完整导出对象状态(如调试、序列化、日志记录),推荐使用 ReflectionClass:
通过 REST API 管理 Kibana 保存的对象(仪表板、Lens 可视化等)。适用于:① 以编程方式创建、更新、删除仪表板和 Lens 可视化。
- 它能绕过访问控制,读取所有属性值
- 需手动处理动态属性、未初始化属性(isset 判断)、以及可能的异常(如不可读属性)
function object_to_array($obj): array
{
$reflection = new ReflectionClass($obj);
$props = [];
foreach ($reflection->getProperties() as $prop) {
$prop->setAccessible(true); // 允许读取 private/protected
$key = $prop->getName();
$value = $prop->getValue($obj);
$props[$key] = $value;
}
return $props;
}
// 使用示例
$result = object_to_array($obj);
print_r($result);
// 输出包含 name、age、secret、role 四个键
注意:get_object_vars 对 stdClass 和匿名类也有效
PHP 的 stdClass 实例(如 json_decode 默认返回)和匿名类对象都支持该函数:
立即学习“PHP免费学习笔记(深入)”;
$json_obj = json_decode('{"a":1,"b":2}');
$std_array = get_object_vars($json_obj); // ['a' => 1, 'b' => 2]
$anon = new class { public $x = 'ok'; };
$anon_array = get_object_vars($anon); // ['x' => 'ok']
替代方案:__toArray() 魔术方法(推荐封装)
如果对象是你自己定义的类,更规范的做法是实现一个显式转换方法,比如:
- 避免暴露内部敏感属性
- 支持类型转换、格式化(如日期转字符串)
- 便于单元测试和维护
class User
{
public string $name;
private int $id;
public function __construct(string $name, int $id)
{
$this->name = $name;
$this->id = $id;
}
public function toArray(): array
{
return [
'name' => $this->name,
// 不暴露 $this->id,或按需脱敏
];
}
}
$user = new User('Bob', 123);
print_r($user->toArray()); // ['name' => 'Bob']
不复杂但容易忽略:get_object_vars 只看属性声明时的可见性,不执行 getter 方法,也不触发 __get。需要逻辑处理时,优先考虑显式方法或反射。


















