不能。(array)强制转换只转出对象实例的非静态属性,包括public、protected、private属性(带相应前缀),不包含任何静态属性;静态属性需通过ReflectionClass::getStaticProperties()等反射方式获取。

不能。(array) 强制转换只作用于对象实例的属性,完全不涉及静态属性。
为什么静态属性不会被转出
静态属性属于类本身,不是某个对象实例的一部分。而 (array) $obj 的本质是将「该对象实例的成员变量」按可见性规则映射为数组键值对——它操作的是对象内存结构中的实例域(instance properties),和类结构体里的静态存储区无关。
- 即使静态属性是 public,也不会出现在转换结果里
- 转换过程不触发类加载、也不读取类定义中的 static 声明
- 没有语法或机制让
(array)接触到 static 关键字定义的内容
能被 (array) 转出的只有哪些内容
仅限当前对象实例中实际存在的、可访问的非静态属性:
- public 实例属性:直接作为数组键出现,如
$obj->name→$arr['name'] - protected 实例属性:键名带
"\0*\0"前缀,如$arr["\0*\0name"] - private 实例属性:键名带
"\0ClassName\0"前缀,如$arr["\0Test\0test"] - 所有这些都必须是对象创建后真实存在的属性(包括通过构造函数或 setter 设置的)
如果真需要获取静态属性,该怎么做
必须绕过对象转换,改用反射或直接类访问:
立即学习“PHP免费学习笔记(深入)”;
- 用
ReflectionClass获取全部静态属性:(new ReflectionClass($obj::class))->getStaticProperties() - 手动列出并读取:
[$obj::class::$staticProp1, $obj::class::$staticProp2] - 若需合并实例与静态数据,得分别处理再
array_merge()
顺便提醒一个常见误解
有人以为 get_object_vars($obj) 能拿到静态属性——其实也不能。它和 (array) 行为一致,只返回实例属性。PHP 中没有任何内置强制转换或函数会把 static 属性自动纳入对象快照。



















