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() 魔术函数 当反序列化时自动调用(如果类内已经定义)

  • 相关阅读:
    利用DTrace实时检测MySQl
    改进MySQL Order By Rand()的低效率
    RDS for MySQL查询缓存 (Query Cache) 的设置和使用
    RDS For MySQL 字符集相关说明
    RDS for MySQL 通过 mysqlbinlog 查看 binlog 乱码
    RDS for MySQL Mysqldump 常见问题和处理
    RDS for MySQL Online DDL 使用
    RDS MySQL 表上 Metadata lock 的产生和处理
    RDS for MySQL 如何使用 Percona Toolkit
    北京已成为投融资诈骗重灾区:存好骗子公司黑名单,谨防上当!
  • 原文地址:https://www.cnblogs.com/jiechn/p/4654967.html
Copyright © 2011-2022 走看看