首页/PHP/PHP对象的序列化与反序列化实例及原理过程

PHP对象的序列化与反序列化实例及原理过程

PHP对象的序列化与反序列化,在面向对象即OOP中是比较重要的概念,好处很多,比如你可以将对象进行任意形式的传输、存储、以及恢复使用后的初始化,首先先简单看下本教程内涉及到的几个魔术方法。 __serialize()返回字符串,简单理解,将对象转换为可以存储的字符串。 __unserialize(),简单的理解,将已被序列化的对象转换为PHP的值 __sleep()返回一个需要进行序列化保存的成员属性数组,并且只序列化该函数返回的这些成员属性 __wakeup()重建在序列化中可能丢失的任何数据以及处理其它重新初始化的任务。 当然,看到这几个魔术方法,不必担心多复杂,因为它们用法大多固定,且是比较友好的,首先看一个类文件,并且我们默认为本教程所使用的任何PHP文件在同一个目录下。

<?php
	class person{
		public $name;
		public $age;

		public function __construct($name="",$age=""){
			$this->name = $name;
			$this->age = $age;
		}

		public function say(){
			return "我的名字为:".$this->name." 我的年龄为: ".$this->age;
		}

		public function __sleep(){
			return array('name');
			//当一个对象被序列化时,即serialize(),自动调用__sleep()方法(如果存在的话)
			//__sleep()方法必须返回一个数组,且该方法不接收任何参数,
			//这里只序列化name属性
		}

		public function __wakeup(){
			$this->age = 32;
			//当一个对象被反序列化时,即unserialize()时,自动调用__wakeup()方法(如果存在的话)
			//大多用于给新对象进行初始化属性或者初始化方法或者执行一些特定的方法
		}

		public function __destruct(){
			echo "对象被释放";
		}
	}
?>
然后我们再看test1.php文件内容。

<?php
require_once "person.class.php";  //加载类文件,那么是否可以使用__autoload()?回忆一下。
$person1 = new person("mido",30);
echo $person1->say();
SESSION_START();  //开启SESSION
$_SESSION['person1'] = serialize($person1);  //将对象$person1序列化并存储于SESSION
var_dump($_SESSION['person1']);	
?>
接着看test2.php文件内容。

<?php
require_once "person.class.php";  //加载类文件,那么是否可以使用__autoload()?回忆一下。
SESSION_START();
$person1 = unserialize($_SESSION['person1']);  //从SESSION中将person1进行反序列化为对象
echo $person1->say();  //调用对象的方法
?>
总结:以上就是PHP对象在进行序列化及反序列化的整个过程,序列化时调用__sleep(),反序列化时调用__wakeup()。 当然我们借此篇教程也对构造方法(__construct)、析构方法(__destruct)以及自动加载类(__autoload)进行串联,那么到这里,我们的魔术方法相关的教程也就到这了,以上这些魔术方法都是比较常用的,务必搞懂。

如果你对以上内容不熟悉的话,建议看看以前的教程。

收藏:

相关资讯