php unserialize 实现
PHP unserialize 实现
unserialize 是 PHP 中用于将序列化的字符串转换回 PHP 值的函数。它可以将之前通过 serialize 函数生成的数据重新恢复为原始的数据结构。
基本用法
$serializedData = 'a:2:{i:0;s:5:"apple";i:1;s:6:"banana";}';
$unserializedData = unserialize($serializedData);
print_r($unserializedData);
输出:
Array
(
[0] => apple
[1] => banana
)
支持的序列化格式
unserialize 支持多种序列化格式,包括:
- 基本类型:整数、浮点数、字符串、布尔值、NULL
- 复合类型:数组、对象
- 特殊类型:资源(部分支持)
对象反序列化
当反序列化对象时,PHP 会自动调用 __wakeup() 魔术方法(如果存在)。例如:

class Example {
public $data;
public function __wakeup() {
echo "Object unserialized\n";
}
}
$serializedObj = 'O:7:"Example":1:{s:4:"data";N;}';
$obj = unserialize($serializedObj);
安全性注意事项
unserialize 存在安全风险,特别是当处理不可信的输入时。攻击者可能通过构造恶意序列化数据执行任意代码(对象注入攻击)。
安全实践:

- 避免反序列化不可信的数据
- 使用
json_encode/json_decode替代serialize/unserialize处理外部数据 - 实现
__wakeup()或__unserialize()方法进行数据验证
性能考虑
反序列化操作会消耗 CPU 资源,特别是处理大型数据结构时。对于性能敏感场景,可以考虑:
- 缓存反序列化结果
- 使用更高效的序列化格式(如 MessagePack)
- 限制反序列化数据的最大尺寸
错误处理
unserialize 在失败时会返回 false 并可能产生 E_NOTICE 错误。建议使用严格模式检测:
$result = unserialize($data, ['allowed_classes' => false]);
if ($result === false && $data !== serialize(false)) {
// 处理反序列化失败
}
PHP 7.4+ 改进
PHP 7.4 引入了 __serialize() 和 __unserialize() 魔术方法,提供了更灵活的控制:
class ImprovedExample {
private $data;
public function __unserialize(array $data): void {
$this->data = $data['data'];
}
}






