17-6对象序列化与__sleep()和__wackup()–PHP实战开发教程

17-6对象序列化与__sleep()和__wackup()–PHP实战开发教程

兔皖怕叙浦臼娇咀擦盼童瓜免


一、对象的序列化
1.php中的任何值都可以序列化为包含字节流表示的字符串来表示
2.序列化对象可以保存到变量或者文件中,方便保存和传送


新建demo6.php

数值和字符串的序列化

<?php
$num=100;
echo $num."<br>";
//数值序列化
echo serialize($num)."<br>";
//字符串序列化
$name="mengmianren";
echo serialize($name)."<br>";

执行:

17-6对象序列化与__sleep()和__wackup()–PHP实战开发教程第1张


序列化对象

对象序列化的特点:
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);

执行:

17-6对象序列化与__sleep()和__wackup()–PHP实战开发教程第2张


可以将序列化的值保存到变量中需要时再取出来:

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

执行:

17-6对象序列化与__sleep()和__wackup()–PHP实战开发教程第3张


反序列化:

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

执行:

17-6对象序列化与__sleep()和__wackup()–PHP实战开发教程第4张


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

执行:

17-6对象序列化与__sleep()和__wackup()–PHP实战开发教程第5张


__sleep()与__weakup()在数据库的自动连接与断开中十分重要


桅锰犀蠢暑芳括伦池惊叭涪松