get_object_vars() 无论在类内还是类外调用,均只返回目标对象的 public 属性关联数组;它不识别 protected/private 属性、动态属性或计算字段,且与调用位置无关,仅取决于传入对象实例及其当前 public 属性。

get_object_vars() 在类内部和外部调用,行为本身没有差异——它始终只返回目标对象的 public 属性 组成的关联数组,与调用位置无关。关键区别在于:你能传给它的对象是谁、以及该对象当前有哪些 public 属性可见。
调用位置不影响函数逻辑,只影响参数对象的状态
get_object_vars() 是一个全局函数,不依赖 $this 或作用域。它接收一个对象变量作为参数,检查该对象实例的 public 属性,然后返回数组。无论你在类方法里写 get_object_vars($this),还是在类外写 get_object_vars($obj),只要传入的是同一个对象实例,结果完全一致。
- 类内常用写法:
get_object_vars($this)→ 获取当前实例的 public 属性 - 类外常用写法:
get_object_vars($user)→ 获取任意已实例化对象的 public 属性 - 两者返回内容一致的前提是:$this 和 $user 指向同一对象,且其 public 属性未被运行时修改
真正要注意的是“谁的对象”和“属性是否真为 public”
容易混淆的点,往往来自对 protected/private 属性的误判 或 动态属性的缺失:
通过 REST API 管理 Kibana 保存的对象(仪表板、Lens 可视化等)。适用于:① 以编程方式创建、更新、删除仪表板和 Lens 可视化。
- 如果类中定义了
protected $name,哪怕你在类内部调用get_object_vars($this),它也不会出现在结果里 - 如果类用了
__get()提供动态属性(如访问不存在的$obj->nickname),get_object_vars()完全感知不到,因为它只读取真实声明的 public 属性 - 继承关系下,父类的 public 属性会被包含;但父类的 protected/private 属性,即使子类能访问,在 get_object_vars() 结果中依然不可见
类内调用的常见误用场景
有些开发者试图在类方法里用 get_object_vars($this) 来“导出全部状态”,却忽略了实际需求可能需要更多字段:
- 想获取 protected 属性?→ get_object_vars 不行,需用 ReflectionClass + setAccessible(true)
- 想包含计算字段(如
getFullName()返回值)?→ 需手动组装,函数不执行方法 - 想序列化整个对象结构(含私有状态)?→ 应考虑 json_encode + json_decode(true),或自定义 toArray() 方法
安全升级提醒(关联当前环境)
你正在使用 PHP 8.2 —— 请确认已升级至 8.2.35 或更高版本。PHP 官方于 2026 年 10 月紧急修复了两个高危漏洞(CVE-2026-109618 / CVE-2026-109619),影响所有请求处理流程。即使你的代码只用 get_object_vars 这类基础函数,若底层 PHP 引擎存在内存状态残留问题,仍可能导致未授权远程代码执行。升级后务必重启 PHP-FPM 或 Web 服务进程,否则旧内存中的风险状态仍在。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










