兔皖怕叙浦臼娇咀擦盼童瓜免
一、对象的序列化
1.php中的任何值都可以序列化为包含字节流表示的字符串来表示
2.序列化对象可以保存到变量或者文件中,方便保存和传送
新建demo6.php
数值和字符串的序列化
<?php $num=100; echo $num."<br>"; //数值序列化 echo serialize($num)."<br>"; //字符串序列化 $name="mengmianren"; echo serialize($name)."<br>";
执行:
序列化对象
对象序列化的特点:
1.只保存对象中的属性,不保存方法
2.只保存类名,不保存对象名
<?php //对象的序列化 class Db { public $db=null; public $host; private $user; private $pass; //构造方法 public function __construct($host="127.0.0.1",$user="root",$pass="root") { //类属性的初始化 $this->host=$host; $this->user=$user; $this->pass=$pass; //实例化时,应该自动连接数据库 $this->connect(); } private function connect() { $this->db=mysqli_connect($this->host,$this->user,$this->pass); } } //实例化数据库类 $db=new Db(); /** * 对象序列化的特点: * 1.只保存对象中的属性,不保存方法 * 2.只保存类名,不保存对象名 */ echo serialize($db);
执行:
可以将序列化的值保存到变量中需要时再取出来:
$stmt1= serialize($db); echo $stmt1;
__sleep()指示序列化时要保存的字段名
<?php //对象的序列化 class Db { public $db=null; public $host; private $user; private $pass; //构造方法 public function __construct($host="127.0.0.1",$user="root",$pass="root") { //类属性的初始化 $this->host=$host; $this->user=$user; $this->pass=$pass; //实例化时,应该自动连接数据库 $this->connect(); } private function connect() { $this->db=mysqli_connect($this->host,$this->user,$this->pass); } //serialize($obj)序列化的时候,会自动调用__sleep(void) //主要用于对象休眠时的一些清理工作,例如指定哪些属性允许进入到休眠对象的属性序列中 public function __sleep() { //返回由属性名字符串组成的索引数组,指示序列化时要保存的字段名 //即序列化时保存host user pass return ['host','user','pass']; } } //实例化数据库类 $db=new Db(); $stmt1= serialize($db); echo $stmt1;
执行:
反序列化:
<?php //对象的序列化 class Db { public $db=null; public $host; private $user; private $pass; //构造方法 public function __construct($host="127.0.0.1",$user="root",$pass="root") { //类属性的初始化 $this->host=$host; $this->user=$user; $this->pass=$pass; //实例化时,应该自动连接数据库 $this->connect(); } private function connect() { $this->db=mysqli_connect($this->host,$this->user,$this->pass); } //serialize($obj)序列化的时候,会自动调用__sleep(void) //主要用于对象休眠时的一些清理工作,例如指定哪些属性允许进入到休眠对象的属性序列中 public function __sleep() { //返回由属性名字符串组成的索引数组,指示序列化时要保存的字段名 //即序列化时保存host user pass return ['host','user','pass']; } } //实例化数据库类 $db=new Db(); $stmt1= serialize($db); $stmt2=unserialize($stmt1); var_dump($stmt2);
执行:
__wakeup()反序列化时执行的操作(连接数据库)
<?php //对象的序列化 class Db { public $db=null; public $host; private $user; private $pass; //构造方法 public function __construct($host="127.0.0.1",$user="root",$pass="root") { //类属性的初始化 $this->host=$host; $this->user=$user; $this->pass=$pass; //实例化时,应该自动连接数据库 $this->connect(); } private function connect() { $this->db=mysqli_connect($this->host,$this->user,$this->pass); } //serialize($obj)序列化的时候,会自动调用__sleep(void) //主要用于对象休眠时的一些清理工作,例如指定哪些属性允许进入到休眠对象的属性序列中 public function __sleep() { //返回由属性名字符串组成的索引数组,指示序列化时要保存的字段名 //即序列化时保存host user pass return ['host','user','pass']; } public function __wakeup() { //反序列化时连接数据库 $this->connect(); } } //实例化数据库类 $db=new Db(); $stmt1= serialize($db); $stmt2=unserialize($stmt1); var_dump($stmt2->db);
执行:
__sleep()与__weakup()在数据库的自动连接与断开中十分重要
桅锰犀蠢暑芳括伦池惊叭涪松