get_class_vars() 返回空数组最常见原因是目标属性非public或无默认值;它仅返回当前类中public且声明时赋值的属性,忽略protected/private、无初始值的public属性、动态属性、继承属性、trait属性及未加载的类。

get_class_vars() 只返回 public 的默认(即声明时赋值的)属性,且不包含动态添加、继承自父类但未在当前类中显式定义、或被 static 修饰的属性。
为什么 get_class_vars('ClassName') 返回空数组?
最常见原因是目标属性不是 public 且带默认值。该函数完全忽略 protected 和 private 属性,哪怕它们有初始值;也跳过没有初始值的 public 属性(例如 public $x;)。
-
get_class_vars()不触发自动加载,类必须已定义(可用class_exists()检查) - 若类使用了 trait,trait 中的 public 属性 不会 被包含(除非在类中被重新声明并赋值)
- PHP 8.2+ 对只读类(
readonly class)无特殊处理,仍按常规可见性规则过滤
如何获取包括 protected/private 的默认属性?
必须用反射(ReflectionClass),它能绕过可见性限制,但要注意:它返回的是所有声明的属性(含无默认值的),需手动筛选出“有初始值”的。
- 用
$ref = new ReflectionClass($className)实例化 - 调用
$ref->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PRIVATE) - 对每个
ReflectionProperty对象,用$prop->hasDefaultValue()判断是否带默认值,再用$prop->getDefaultValue()获取值 - 注意:
getDefaultValue()在属性是闭包或含无法序列化的值时会抛ReflectionException
get_class_vars() 和 get_object_vars() 的关键区别
前者查类定义时的 public 默认值,后者查对象实例当前的 public 属性值(含运行时修改、不含未初始化的属性)。
-
get_class_vars('Foo')→ 返回['x' => 1](仅基于public $x = 1;) -
get_object_vars(new Foo())→ 若$obj->y = 2已执行,则返回['x' => 1, 'y' => 2];若$x从未被读写,仍包含'x' => 1 - 两者都不返回
protected/private,也不反映构造函数中的赋值逻辑
真正容易被忽略的是:即使你把属性改成 public $flag = true;,只要类文件没被加载(比如依赖 autoloader 但路径错),get_class_vars() 就静默返回空数组——它不报错,也不提示缺失类。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











