zoukankan      html  css  js  c++  java
  • 序列化魔术函数__sleep()和反序列化魔术函数__wakeup()

    1.string serialize ( mixed $value )— 产生一个可存储的值的表示
      serialize() 返回字符串,此字符串包含了表示 value 的字节流,可以存储于任何地方。
      这有利于存储或传递 PHP 的值,同时不丢失其类型和结构

    想要将已序列化的字符串变回 PHP 的值,可使用 unserialize()

    @ 序列化数组

      serialize($arr); 

    在设置cookie的时候可以通过序列化数组的形式传递多个值,然后在接收页面进行反序列化读取

    @ 序列化对象

    class ren{
    	private $name;
    	private $age;
    	function __construct($name,$age){
    		$this->name =$name;
    		$this->age = $age;
    	}
    	function show(){
    		echo "姓名是:{$this->name}  年龄是:{$this->age}";
    	}
    	function __sleep(){   //魔术函数  指定序列化那些内容,以数组形式返回,不定义则全部序列化 
    		return array('name','age');
    		//return array_keys(get_object_vars($this));
    	}
    }
    $zao = new ren("赵六",44);
    echo serialize($zao);
    

      __sleep() 序列化函数调用时自动执行的函数,可以限定要序列化的属性

    2.mixed unserialize ( string $str [, string $callback ] ) — 从已存储的表示中创建 PHP 的值
      unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。

      返回的是转换之后的值,可为 integer、float、string、array 或 object。如果传递的字符串不可解序列化,则返回 FALSE

    备注:

      对象序列化后,只是序列化存储的对象的属性,方法没有被序列化(因为方法是属于类的,不属于单个对象)
      反序列化时,只是把属性反序列化,可使用__wakeup()魔术函数,在成功地重新构造对象之后,PHP 会自动地试图去调用 __wakeup() 成员函数(如果存在的话)。

    对象序列化

    class db {
    	private $host;
    	private $user;
    	private $pwd;
    	private $dbname;
    	private $mysqli;
    	function __construct($host, $user, $pwd, $dbname) {
    		$this->host = $host;
    		$this->user = $user;
    		$this->pwd = $pwd;
    		$this->dbname = $dbname;
    		$this->db();
    	}
    	function db() {
    		$this->mysqli = new mysqli ( $this->host, $this->user, $this->pwd, $this->dbname );
    	}
    	function select() {
    		$this->mysqli->query("SET CHARSET GBK");
    		$sql = "SELECT id,cname FROM hdw_channel";
    		$result = $this->mysqli
    			->query ( $sql );
    		$rows = array ();
    		while ( $row = $result->fetch_assoc () ) {
    			$rows [] = $row;
    		}
    		ECHO "<PRE>";
    		print_r ( $rows );
    	}
    	function __wakeup(){  //反序列化自动运行链接数据库
    		$this->db();
    	}
    }
    session_start();
    $chanel = new db("localhost",'root','','hdcms');
    //$chanel->select();
    $_SESSION['channel_obj'] = serialize($chanel);
    

    接收页面,反序列化

    session_start();
    include '59.php'; //载入此类文件
    $channel_obj=unserialize($_SESSION['channel_obj']); 反序列化对象
    $channel_obj->select();
    

      __wakeup() 魔术函数 当反序列化时自动调用(如果类内已经定义)

  • 相关阅读:
    Zookeeper 系列(五)Curator API
    Zookeeper 系列(四)ZKClient API
    Zookeeper 系列(三)Zookeeper API
    Zookeeper 系列(二)安装配制
    [bzoj 2393] Cirno的完美算数教室 (容斥原理+dfs剪枝)
    [Sdoi2013] [bzoj 3198] spring (hash+容斥原理)
    [bzoj 1471] 不相交路径 (容斥原理)
    [bzoj 3701] Olympic Games (莫比乌斯反演)
    [bzoj 2693] jzptab & [bzoj 2154] Crash的数字表格 (莫比乌斯反演)
    [51Nod 1244]
  • 原文地址:https://www.cnblogs.com/jiechn/p/4654967.html
Copyright © 2011-2022 走看看