对象的保存和还原之序列化,反序列化

目录

一: 背景

二: 对象的保存之序列化

三: 对象的还原之反序列化

四: 序列化和反序列化在cookie中的应用


一: 背景

       在使用数据库操作类的时候,只想实例化一次,后面把对象保存在文件中,在要用到数据库操作类的对象的地方,直接从文件中读取对象;

二: 对象的保存之序列化

1.eg:

<?php
  //重载
  class Person
  {
  	public $name = "张三";
  	protected $sex = "男";
  	private $money = 200;
  
  	public function show()  //属性名称
  	{  		
  		echo "<br />";
  		echo $this->sex;
  		echo "<br />";
  		echo $this->money;
  	}

  }
  $p = new Person();
  var_dump($p);

效果:

object(Person)#1 (3) {
  ["name"]=>
  string(6) "张三"
  ["sex":protected]=>
  string(3) "男"
  ["money":"Person":private]=>
  int(200)
}

2.file_put_contents不能把对象写入文件,只能写入一个字符串

int file_put_contents( string $filename, mixed $data[, int $flags = 0[, resource $context]] )

3.解决方案: 可以把对象转换为一个字符串,想保证对象结构的完整性,也即转变为字符串的时候不会因为数据类型的改变而把对象的性质变了;

4.序列化serialize: 可以将复合数据类型,保留其原有的属性或者结构,来转换成一个序列化后的字符串

string serialize( mixed $value)
<?php
  //对象的保存:序列化 
  class Person
  {
  	public $name = "张三";
  	protected $sex = "男";
  	private $money = 200;
  
  	public function show()  //属性名称
  	{  		
  		echo "<br />";
  		echo $this->sex;
  		echo "<br />";
  		echo $this->money;
  	}

  }
  $p = new Person();
   //对象转换为字符串
  $p=serialize($p);
  /**
   * var_dump($p);
   * string(91) "O:6:"Person":3:{s:4:"name";s:6:"张三";
   * s:6:"*sex";s:3:"男";s:13:"Personmoney";i:200;}"
   */
  //把对象写入到同级目录obj.txt文件中
  if(file_put_contents('obj.txt',$p))
  {  //对象无法写进去
	  echo 'ok';
  }
  else
  {
	  echo 'no';
  }
  

obj文件内容:

4f3a 363a 2250 6572 736f 6e22 3a33 3a7b
733a 343a 226e 616d 6522 3b73 3a36 3a22
e5bc a0e4 b889 223b 733a 363a 2200 2a00
7365 7822 3b73 3a33 3a22 e794 b722 3b73
3a31 333a 2200 5065 7273 6f6e 006d 6f6e
6579 223b 693a 3230 303b 7d

三: 对象的还原之反序列化

1.从文件中读出对象所保存的内容

    file_get_contents — 将整个文件读入一个字符串

string file_get_contents( string $filename[, 
bool $use_include_path = false[,
 resource $context[, 
int $offset = -1[, int $maxlen]]]] )

2.反序列化unserialize  

mixed unserialize( string $str)

=>unserialize — 从已存储的表示中创建 PHP 的值;

=>unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值;

=>可以把原来保存在文件中的内容按其序列化前结构原样输出;

=>反序列化,得到对象,是一个PHP不完整类(基类)的一个对象;

=>要想得到之前的Person类的对象,必须保证Person类在内存中存在;

=>由于之前保存的是哪个类的对象不确定,所以可以使用自动加载函数来完成;

=>获得的对象跟之前的对象(资源属性被改变了)不一致;

=>由于序列化后数据库的连接资源被强制转换为整型,反序列后得到的对象连接资源依然是整型,而数据库的操作必须是建立在连接资源存在的情况下。

<?php
  //从文件中读取该对象 
  $str=file_get_contents('obj.txt'); 
  //O:6:"Person":3:{s:4:"name";s:6:"张三";s:6:"*sex";s:3:"男";s:13:"Personmoney";i:200;}
  //自动加载机制
  function __autoload($class)
  {
	if(file_exists("../{$class}.class.php"))
	{
		include "../{$class}.class.php";
    }
  }  

  //把字符串重新转换为对象
  $obj=unserialize($str);
  var_dump($obj);
  //要使用对象,必须保证该类在内存中存在

效果:


object(__PHP_Incomplete_Class)#1 (4) {
  ["__PHP_Incomplete_Class_Name"]=>
  string(6) "Person"
  ["name"]=>
  string(6) "张三"
  ["sex":protected]=>
  string(3) "男"
  ["money":"Person":private]=>
  int(200)
}

四: 序列化和反序列化在cookie中的应用

在cookie无法保存数组

解决方法:

1.把复合数据类型数组转换为字符串,保存在cookie中,使用序列化;

2.重新把字符串转换成数组,进行反序列化处理

另外一种方式解决数组转换为字符串

 1. json_encode(数组): 把数组转换为json格式的字符串;

 2. json_decode(json格式的字符串,[true/false]): 把json格式的字符串转换为对象(可以没有);

<?php
   //解决cookie无法存数组的问题
   $arr=[
         ['good_id'=>1,'goods_num'=>100],
         ['good_id'=>1,'goods_num'=>100]
		];
  
   //把数组转换为字符串存到cookie中
      //第一种 json_encode()
	  //$cart=json_encode($arr);
	  $cart=serialize($arr);
   setcookie('cart',$cart,time()+3600);
   //var_dump($_COOKIE);

  //$cart=json_decode($_COOKIE['cart'],true);
     $cart=unserialize($_COOKIE['cart']);
   var_dump($cart);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值