PHP 序列化

什么是序列化

变量序列化:将变量转成可存储或可传输的字符串的过程,会保留变量的类型和结构。

变量反序列化:将序列化的字符串,还原成原始变量。

除了资源变量外,其他变量都可以序列化。

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);

阅读更多
文章标签: 序列化 反序列化
上一篇类型约束
下一篇PHP SQL注入
想对作者说点什么? 我来说一句

java序列化对象传给php

2016年01月17日 23KB 下载

php中的序列化

php中的序列化

pish7 pish7

2017-12-14 17:02:57

阅读数:72

没有更多推荐了,返回首页

关闭
关闭