对象序列化是指: 将一个对象转换成一个字符串,这个字符串包括 属性名,属性值,属性类型, 和该对象对应的类名。简单的说明就把一个对象的数据和数据类型转成字符串.
案例说明:(需求:将对象保存到文件中)
class Cat{ public $name; protected $age; private $food; public function __construct($name,$age,$food){ $this -> name = $name; $this -> age = $age; $this -> food = $food; } } $cat1 = new Cat("小花猫",3,"沙丁鱼"); //将对象保存到文件中,在保存对象前需要将对象序列化 file_put_contents('./cat.log', serialize($cat1));
反序列化就是指 :将一个序列化的字符串,重新恢复成对应的对象.
案例说明:(需求:将文件中的对象读取出来)
//引入类的定义 class Cat{ public $name; protected $age; private $food; public function __construct($name,$age,$food){ $this -> name = $name; $this -> age = $age; $this -> food = $food; } } //对象的反序列化 //1.读取序列化的字符串 传入地址 $cat_obj_str = file_get_contents('./cat.log'); //2.进行反序列化操作 $cat_obj = unserialize($cat_obj_str); //如果我们希望正确的操作反序列化对象则需要引入该对象的类定义 echo '<br>name是' . $cat_obj -> name;
对象序列化和反序列化的细节:
(1)如果我们希望正确的操作反序列化对象,则需要引入该对象的类定义
(2)序列化的优点:
对象序列化利于对象的保存和传输
可以让多个文件共享对象,而且我们将序列化后的对象保存到文件中,还可以达到在不同的时间段操作该对象.
(3)如果类中存在魔术方法 __sleep 序列化该类中的对象则会先调用__sleep函数, 魔术方法返回一个数组,该数组可以选择性的序列化部分属性
如果类中存在魔术方法__wakeup反序列化该类中的对象时则会先调用__wakeup函数,该魔术方法可以对反序列化的对象制定属性进行初始化或者恢复连接资源
案例说明:
class Cat{ public $name; protected $age; private $food; public function __construct($name,$age,$food){ $this -> name = $name; $this -> age = $age; $this -> food = $food; } //如果类中不存在魔术方法__slppe则会序列化所有属性 public function __sleep(){ //可以在返回的数组中决定哪些属性被序列化 return array('name','food'); } public function __wakeup(){ $this -> name = '藏獒'; } } $cat1 = new Cat("小花猫",3,"沙丁鱼"); //序列化该对象 $cat_str = serialize($cat1); //将序列化对象后的字符串保存到文件中 file_put_contents('./cat.log', $cat_str); //由于类中存在魔术方法__sleep 输出的结果将只有返回的数组中存在的属性 var_dump($cat_str); //反序列化 $cat_obj = unserialize($cat_str); //由于类中存在魔术方法 __wakeup 则反序列化之前调用的该方法将对象中的name值更改为了藏獒 var_dump($cat_obj);