面向对象的串行化 以及反串行化

用serialize() 函数实例化一个类的时候会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。__sleep() 方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。

魔术方法__wakeup:

与serialize()相反,unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。

<?php 
   //串行化存入object.txt文档 

    class Person{
		public $name = "Feiyu";
		public $age = 22;
		public $sex = "nan";
		
		public function say(){
			echo $this->name."<hr/>".$this->age."<hr/>".$this->sex;
		}
	}
	
	$p = new Person;
	$p->name = "老张";
	$p->age = 50;
	$p->sex = "nan";
	$p->say();
	echo "<hr/>";
	$str = serialize($p);
	file_put_contents("object.txt",$str);

 生成 

<?php 
    //返串行化 
    class Person{
		public $name = "Feiyu";
		public $age = 22;
		public $sex = "nan";
		
		public function say(){
			echo $this->name."<hr/>".$this->age."<hr/>".$this->sex;
		}
		//就如同一个模板
		// 拓展   
		public function sleep(){
			echo "sleep";
	    }
	}
	

	$str = file_get_contents("object.txt");
	//对一个对象反序列化的时候 必须要有原对象在场 
	$obj = unserialize($str);
	$obj->say();
	echo "<hr/>";
    $obj->sleep();
	echo "<hr/>";


        

就像是开始时候做的留言板 存入的 txt 文档  同样可以存入数据库  一个存入 Put 一个取出get过程 取出时必须用原型类  

<?php 
    class Apple{
		public $dy;      //电源线 
		public $pm;       //屏幕 
		public $cpu;      //cpu 
		public $men;      //内存
		public $baoxiu;   //保修期
		
		public function code(){
			echo "敲代码";
		}
		
		public function play(){
			echo "看电影";
		}
		
		public function chat(){
			echo "聊天";
		}
		//可以保住我们将所需要的成员属性序列化 
		public function __sleep(){ 
		//返回序列化属性 
			return array('dy','baoxiu');
		}
	}
	
	$apple = new Apple;
	$apple->baoxiu = 1;

    $str = serialize($apple);
	file_put_contents('apple.txt',$str);
<?php
     header("content-type:text/html;charset=utf-8"); 
    class Apple{
		public $dy;      //电源线 
		public $pm;       //屏幕 
		public $cpu;      //cpu 
		public $men;      //内存
		public $baoxiu;   //保修期
		
		public function code(){
			echo "敲代码";
		}
		
		public function play(){
			echo "看电影";
		}
		
		public function chat(){
			echo "聊天";
		}
		//可以保住我们将所需要的成员属性序列化 
		public function __sleep(){ 
		//返回序列化属性 
			return array('dy','baoxiu');
		}
		
		//当反序列化的时候自动将保修期回改回为3年 
		public function __wakeup(){
			$this->dy = "崭新的二手电源";
            $this->baoxiu = 3;     				
		}		
	}
	
	$apple = new Apple;
	$apple->baoxiu = 1;

    $str = serialize($apple);
	file_put_contents('./apple.txt',$str);
    // 接收包裹 
	file_get_contents("./apple.txt");
	 
	//把包裹打开 
	$obj = unserialize($str);
	$obj->dy = "崭新的二手电源";
	echo "<pre>";
	var_dump($obj);
	echo "</pre>";
	//为完成对象 拿过上个类对象 

猜你喜欢

转载自blog.csdn.net/feiyucity/article/details/86481600
今日推荐