什么是序列化
变量序列化:将变量转成可存储或可传输的字符串的过程,会保留变量的类型和结构。
变量反序列化:将序列化的字符串,还原成原始变量。
除了资源变量外,其他变量都可以序列化。
serialize()
代码:
<?php
$arr = array(
'db_host' => 'localhost',
'db_name' => 'test',
'db_user' => 'user',
'db_pass' => 'root',
'charset' => 'utf8',
);
$str = serialize($arr); //数组序列化
echo $str;
unserialize()
代码:
<?php
$arr = array(
'db_host' => 'localhost',
'db_name' => 'test',
'db_user' => 'user',
'db_pass' => 'root',
'charset' => 'utf8',
);
$str = serialize($arr);
$arrs = unserialize($str);
var_dump($arrs);
对象序列化
对象序列化的过程与其他变量一样
当序列化对象时,PHP将试图在序列化动作之前调用该对象的魔术方法__sleep(),这样就允许对象在被序列化之前做任何清除操作。
对象序列化的内容只能包含成员属性,不能包含常量、静态属性、静态方法、成员方法。
__sleep()方法:该方法先被调用,然后才能执行序列化。此功能可以用于清理对象,并返回一个包含对象中应被序列化的变量名称的数组。如果该方法没有返回任何内容,则null被序列化,并产生一个noitce级别错误。
__sleep()不能返回父类私有属性成员的名字。
上代码:
<?php
//定义最终的数据库工具类
final class Db{
private $dbHost;
private $dbUser;
private $dbPass;
public function __construct(array $conf){
$this -> dbHost = $conf['dbHost'];
$this -> dbUser = $conf['dbUser'];
$this -> dbPass = $conf['dbPass'];
$this -> connectDb();
}
private function connectDb(){
if(!@mysql_connect($this->dbHost,$this->dbUser,$this->dbPass))
die('false');
}
//返回需要的成员属性,不需要不写
public function __sleep(){
return array('dbHost','dbUser');
}
}
$arr = array(
'dbHost' => 'localhost',
'dbUser' => 'root',
'dbPass' => 'root',
);
$db = new Db($arr);
//对象序列化
$str = serialize($db);
echo $str;
对象反序列化
对象的反序列化过程,与其他变量一样
若凡序列化的变量是一个对象,在成功地重新构造对象之后,PHP会自动试图调用__wakeup()成员函数(如果存在的话)
unserialize() 会检查是否存在一个wakeup()方法,如果存在,则优先调用wakeup()方法,预先准备对象需要的资源。
__wakeup() 经常用在反序列化过程中,进行一些初始化操作,例如重新建立数据库连接,或执行其他初始化操作
上代码:
final class Db{
private $dbHost;
private $dbUser;
private $dbPass;
public function __construct(array $conf){
$this -> dbHost = $conf['dbHost'];
$this -> dbUser = $conf['dbUser'];
$this -> dbPass = $conf['dbPass'];
$this -> connectDb();
}
private function connectDb(){
if(!@mysql_connect($this->dbHost,$this->dbUser,$this->dbPass))
die('false');
}
public function __sleep(){
return array('dbHost','dbUser');
}
public function __wakeup(){
$this ->dbPass = 'root';
$this ->dbName = 'test';
}
}
$arr = array(
'dbHost' => 'localhost',
'dbUser' => 'root',
'dbPass' => 'root',
);
$db = new Db($arr);
//对象序列化
$str = serialize($db);
//对象已经保存为字符串,直接反序列化即可。
$db = unserialize($str);
var_dump($db);