PHP核心技术与最佳实践之对象的序列化
对象是一堆数据,可以把对象存储起来,以便需要时使用,这就是对象的序列化。
所谓序列化,就是把保存在内存中的各种对象状态(属性)保存起来,并且在需要时可以还原出来。下面代码实现了把内存中的对象当前状态保存到一个文件中。
$str = serialize($student);
Echo $str;
File_put_contents(‘store.txt’,$str);
输出序列化后的结果:
O:6:”person”:2:{s:4:”name”;s:3:”Tom”;s:6:”gender”;s:4:”mail”;}
在需要时,反序列化取出这个对象:
$str = file_get_contents(‘store.txt’);
$student =unserialize($str);
$student->say();
注意:在序列化和反序列化时都需要包含类的对象的定义,不然有可能出现在反序列化对象时,找不到该对象的类的定义,而返回不正确的结果。
可以看到,对象序列化后,存储的只是对象的属性。类是由属性和方法组成的,而对象则是属性的集合,由同一个类生成的不同对象,拥有各自不同的属性,但共享了类的代码空间中方法区域的代码。
拓展:serialize/unserialize是PHP自带的序列化函数,但是这组函数序列化时会产生无用的信息,如字符串长度,造成空间的无为浪费。
__toString()也是一种序列化。其中实现自己的序列化和反序列化,json_encode/json_decode是一个不错的选择。