get_object_vars() 在 PHP 8.2 中对匿名类完全有效,仅返回 public 属性,包括默认 public 和构造/后续设置的 public 属性,忽略 protected/private 属性及动态添加属性。

get_object_vars() 在 PHP 8.2 中对匿名类完全有效,但只返回其 public 属性,行为与命名类一致。
支持匿名类,但仅限 public 属性
PHP 8.2 的 get_object_vars() 不区分匿名类或普通类,只要对象实例存在且属性是 public,就能正常提取:
- 匿名类中定义的 public 属性(包括构造时赋值或后续设置)会被完整包含
- 未声明可见性的属性默认为 public,也会被纳入结果数组
- protected 或 private 属性 —— 即使你在匿名类里显式写了
protected $x—— 仍被忽略,不会出现在返回数组中
实际用法示例
以下代码在 PHP 8.2 下可直接运行:
通过 REST API 管理 Kibana 保存的对象(仪表板、Lens 可视化等)。适用于:① 以编程方式创建、更新、删除仪表板和 Lens 可视化。
$obj = new class {
public $name = "Alice";
public $score = 95;
protected $token = "xyz"; // 不出现
private $secret = "hidden"; // 不出现
};
$arr = get_object_vars($obj);
// 结果:['name' => 'Alice', 'score' => 95]
注意事项
匿名类没有类名字符串参与运行时反射,但这不影响 get_object_vars() —— 它不依赖类名,只检查当前作用域下的可访问性规则:
- 属性必须已定义(哪怕值为
null),未声明的属性不会被“猜测”出来 - 动态添加的属性(如
$obj->newProp = 123)在 PHP 8.2+ 默认触发E_WARNING(因动态属性已被弃用),且get_object_vars()不会返回它们 - 若匿名类继承自父类,
get_object_vars()仍只返回该实例自身的 public 属性,不自动合并父类 public 属性(除非父类属性被子实例实际继承并可访问)
替代方案对比
如果确实需要读取匿名类的 protected/private 属性,get_object_vars() 不适用,可考虑:
-
(array)强制转换:能拿到所有属性,但键名含不可读前缀(如\0*\0token),需手动清理 -
ReflectionClass+setAccessible(true):可安全访问全部属性,但代码更重,适合工具类场景 - JSON 方案(
json_decode(json_encode($obj), true)):要求属性可序列化,且会丢弃资源、闭包等类型
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










