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

时间: 2024-10-12 04:02:21

序列化魔术函数__sleep()和反序列化魔术函数__wakeup()的相关文章

PHP 魔术方法 __sleep __wakeup(四)

串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. 你在反串行化类的对象之前定义的类,PHP可以成功地存储其对象的属性和方法. 有时你可能需要一个对象在反串行化后立即执行. 为了这样的目的,PHP会自动寻找__sleep和__wakeup方法. 当一个对象被串行化,PHP会调用__sleep方法(如果存在的话). 在反串行化一个对象后,PHP 会调用__wakeup方法. 这两个方法都不接

魔术方法__sleep 和 __wakeup

感觉序列化和反序列化用得倒是比较少了,而json_encode和json_decode用得相对多,都是转化成串,进行入库.传输等.json更方便,但是序列化和反序列化结合这两个魔术方法使用倒还行<?php /** * 魔术方法__sleep() 和 __wakeup() * __sleep(): serialize()序列化之前调用,返回一个需要保存变量名数组.一般用来保存部分属性,节省空间 * __wakeup():unserialize() 反序列化之前调用,无返回值,一般进行一个动作 */

PHP开发常用函数和必须会的函数总结 --带例子

PHP开发常用函数 在共过开发中,我经常要用到一些PHP函数,有时会不记得,这里把这些常用函数总结到一起.本篇列举了PHP程序员开发中经常用到的php函数.几乎每个函数都有例子,老手可以看看当做温习,新手可以背理论,然后把例子敲他几遍,后面再开发中,开发效率绝对有所提高.例子大多取自w3cschool标准例子和网上的一些资源,部分为个人所写,均经过测试.如果要装载本文,还请注明来源 :http://blog.csdn.net/qq_22327455. 一.检查函数 1.empty() empty

C++学习笔记(2)---2.5 C++函数编译原理和成员函数的实现

转载自:http://c.biancheng.NET/cpp/biancheng/view/2996.html点击打开链接 从上节的例子可以看出,对象的内存模型中只保留了成员变量,除此之外没有任何其他信息,程序运行时不知道 obj 的类型为 Demo,也不知道它还有一个成员函数 display().那么,究竟是如何通过对象调用成员函数的呢? C++函数的编译 C++和C语言的编译方式不同.C语言中的函数在编译时名字不变,或者只是简单的加一个下划线_(不同的编译器有不同的实现),例如,func()

JQuery之JQuery的版本 JQuery入门 属性获取 JQuery就绪函数 JS文档就绪函数和JQuery文档就绪函数的区别 JS对象和JQuery对象的区别 关于$的使用 多个JS库的冲突解决方案

JQuery的版本 JQuery入门 属性获取 JQuery就绪函数 JS文档就绪函数和JQuery文档就绪函数的区别 JS对象和JQuery对象的区别 关于$的使用 多个JS库的冲突解决方案 JQuery的版本 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>jQuery的版本</title> <

python函数(2):函数进阶

昨天说了函数的一些最基本的定义,今天我们继续研究函数.今天主要研究的是函数的命名空间.作用域.函数名的本质.闭包等等 预习: 1.写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作 2.写函数,检查用户传入的对象(字符串.列表.元组)的每一个元素是否含有空内容. 3.写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者. dic = {"k1": "v1v1", "k2

【函数】02、匿名函数、生成器、高阶函数

一.匿名函数 1.定义 语法格式: lambda args:expression args:以逗号分隔的参数列表 expression:用到args中各参数的表达式 lambda定义的代码必须是合法的表达式,不能出现多条件语句(可使用if的三元表达式)和非表达式,如for和while等 lambda的首要用途是指定短小的回调函数 lambda将返回一个函数而不是将函数赋值给某变量名 In [77]: lambda x: x+1 Out[77]: <function __main__.<lamb

把一个函数作为参数传入到函数中

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <script> function f1(func){ //func函数作为参数传入f1函数 console.log('1'); //首先进入f1函数 setTimeout(function(){ console.log('2'); //继续进入setTimeout方法

文成小盆友python-num3 集合,函数,-- 部分内置函数

本接主要内容: set -- 集合数据类型 函数 自定义函数 部分内置函数 一.set 集合数据类型 set集合,是一个无序且不重复的元素集合 集合基本特性 无序 不重复 创建集合 #!/bin/env python s1 = {"1","2","3","4"} ##或者 s2 = set() set 提供的功能 1 class set(object): 2 """ 3 set() -> n