PHP 不同类型的序列化

示例

生成值的可存储表示形式。

这对于存储或传递PHP值而不丢失其类型和结构很有用。

要再次将序列化的字符串转换为PHP值,请使用unserialize()

序列化字符串

$string = "Hello world";    
echo serialize($string);

// 输出: 
// s:11:"Hello world";

序列化双精度

$double = 1.5;    
echo serialize($double);

// 输出: 
// d:1.5;

序列化浮点数

浮点数被序列化为双打。

序列化整数

$integer = 65;    
echo serialize($integer);

// 输出: 
// 我:65;

序列化布尔值

$boolean = true;    
echo serialize($boolean);

// 输出: 
// b:1;

$boolean = false;    
echo serialize($boolean);

// 输出: 
// b:0;

序列化null

$null = null;    
echo serialize($null);

// 输出: 
// N;

序列化数组

$array = array(
    25,
    'String',
    'Array'=> ['Multi Dimension','Array'],
    'boolean'=> true,
    'Object'=>$obj, // 上面示例中的$obj
    null,
    3.445
); 


// 这将引发致命错误
// $array['function'] = function() { return "function"; };

echo serialize($array);

// 输出:
// a:7:{i:0;i:25;i:1;s:6:"String";s:5:"Array";a:2:{i:0;s:15:"Multi Dimension";i:1;s:5:"Array";}s:7:"boolean";b:1;s:6:"Object";O:3:"abc":1:{s:1:"i";i:1;}i:2;N;i:3;d:3.4449999999999998;}

序列化对象

您还可以序列化对象。

序列化对象时,PHP将尝试__sleep()在序列化之前调用成员函数。这是为了允许对象在序列化之前进行最后一分钟的清理等。同样,当对象是使用恢复unserialize()__wakeup()成员函数被调用。

class abc {
    var $i = 1;
    function foo() {
        return 'hello world';
    }
}

$object = new abc(); 
echo serialize($object);

// 输出:
// O:3:"abc":1:{s:1:"i";i:1;}

请注意,闭包不能序列化:

$function = function () { echo 'Hello World!'; };
$function(); // prints "hello!"

$serializedResult = serialize($function);  // 致命错误:消息“不允许序列化序列化”的未捕获异常“ Exception”