php 7.2序列化时public属性直写键名,protected加\x00*\x00前缀,private加\x00类名\x00前缀;反序列化后private/protected属性不可直接访问,未定义类时返回__php_incomplete_class对象,__wakeup()在属性赋值后执行。

PHP 7.2 中序列化对象时,对 public、protected、private 属性的处理方式与反序列化时的读取行为有明确规则,这些规则直接影响数据能否被正确还原和安全访问。
对象属性在序列化字符串中的表示方式
-
public属性:直接以键名出现,如s:4:"name";s:4:"John"; -
protected属性:键名前加\x00*\x00,如s:8:"\x00*\x00role";s:5:"admin"; -
private属性:键名前加\x00类名\x00,如s:11:"\x00User\x00id";i:123;
这些前缀是 PHP 序列化协议的一部分,不可省略或手动构造,否则 unserialize() 会解析失败或产生 __PHP_Incomplete_Class 实例。
反序列化后属性的可访问性限制
- 反序列化生成的对象,其
private和protected属性在外部代码中不能直接读写(符合封装原则) - 即使属性已存在,未定义对应类时,
unserialize()返回的是__PHP_Incomplete_Class对象,仅保留原始属性值和__PHP_Incomplete_Class_Name字符串 - 此类对象调用
is_object()在 PHP 7.2+ 返回true,但无法调用任何方法,也不能通过$obj->prop访问属性(会触发__get或报错)
__wakeup() 与属性初始化时机
-
__wakeup()在反序列化完成、所有属性赋值后立即执行 - 此时
private/protected属性已就位,可在其中做校验、重置资源、补全缺失状态 - 若类未定义或
allowed_classes未放行,__wakeup()不会被调用
安全读取建议
- 不依赖
unserialize()后直接访问私有属性,应通过公开方法获取数据 - 使用
get_object_vars()仅返回public属性;如需完整结构,配合反射(ReflectionObject)可控读取 - 对不可信来源的序列化字符串,禁止反序列化——这是最根本的安全边界
注意:PHP 7.2 起默认启用更严格的对象类型检查,但不影响序列化格式本身;object 类型提示不改变反序列化逻辑,仅约束函数参数。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











