在 PHP 中,内置函数 unserialize() 从 PHP 版本 4 开始可用。在 PHP 7 中,添加了传递允许的类列表的条款。这允许筛选出不受信任的源。unserialze() 函数仅从受信任的类中反序列化数据。
在 PHP 中,序列化意味着生成值的可存储表示形式。这对于存储或传递 PHP 值而不丢失它们的类型和结构很有用。内置的 serialize() 函数用于此目的。
serialize(mixed $value):string
unserialze() 函数从序列化表示中给出一个 PHP 值。从 PHP 7 开始,unserialize() 函数遵循以下格式 -
unserialize(string $data, array $options = [ ]): mixed
$data 参数是要反序列化的序列化字符串。
新引入了 $options 参数。它是以下键的关联数组 -
名称 | 描述 |
---|---|
allowed_classes | 一个应该被接受的类名数组, 或 false 表示不接受任何类, 或 true 接受所有类。 省略此选项等同于将其定义为 true |
max_depth | 取消序列化期间允许的结构的最大深度。 |
请看下面的例子 -
<?php
class MyClass {
var int $x;
function __construct(int $x) {
$this->x = $x;
}
}
class NewClass {
var int $y;
function __construct(int $y) {
$this->y = $y;
}
}
$obj1 = new MyClass(10);
$obj2 = new NewClass(20);
$sob1 = serialize($obj1);
$sob2 = serialize($obj2);
//接受所有类的默认行为
//第二个论点可以省略。
//如果allowed_classes传递为false,unserialize会将所有对象转换为__PHP_Incomplement_Class对象
$usob1 = unserialize($sob1 , ["allowed_classes" => true]);
// 将所有对象转换为__PHP_Inflete_Class对象,MyClass和NewClass的对象除外
$usob2 = unserialize($sob2 , ["allowed_classes" => ["MyClass", "NewClass"]]);
echo $usob1->x . PHP_EOL;
echo $usob2->y . PHP_EOL;
?>
将产生以下输出 -
10
20
20