PHP 对象/数组 串行化 序列化 __sleep() __wakeup() json_encode() json_decode()
27
2014-01-24
串行化/序列化:将对象转成字符串。
反串行化/反序列化:将字符串转成对象。
串行化时机:
1、将对象在网络中传输
2、将对象持久保存
serialize()
串行化
unserialize()
反串行化
__sleep()
串行化时自动调用的PHP魔术方法。可以设置需要串行化的对象的属性。只要在此方法中返回一个声明了属性名的数组,那么这个属性名就会被串行化;没有声明的属性名,则不会被串行化;不加这个魔术函数,则都被串行化。
__wakeup()
反串行化时自动调用的魔术方法。对串行化回来的对象进行初始化和下面方法作用相似:
__construct()
__clone()
。
对象的串行化
class Person { static $obj = null; private function __construct() { } static function getObj() { // 第一次调用时,没有对象,则创建对象;以后调用时,直接使用第一次创建的对象 if ( is_null( self::$obj ) ) { self::$obj = new self; } return self::$obj; } function say() { echo '说
'; } function __destruct() { echo '释放了
'; } } $o = Person::getObj(); $o->say(); // 将 $o 对象串行化 $str = serialize( $o ); // 将字符串保存到 str.txt 文件中 file_put_contents( 'str.txt', $str ); echo '保存成功!
'; // 文件 str.txt 中读取字符串 $str2 = file_get_contents( 'str.txt' ); // 反串行化 $p = unserialize( $str2 ); echo '读取成功!
'; $p->say(); /* 打印结果: 说 保存成功! 读取成功! 说 释放了 释放了 */
数组的串行化
class Person { public $name; public $age; public $sex; public function __construct( $name, $age, $sex ) { $this->name = $name; $this->age = $age; $this->sex = $sex; } function say() { echo "我叫{$this->name},今年{$this->age}岁
"; } function __sleep() { echo '只串行化name和age
'; return array('name', 'age'); } function __wakeup() { echo '反串行化时调用 __wakeup()
'; $this->age = 20; } function __destruct() { echo '释放了
'; } } $o = new Person( 'xmoon', 18, '男' ); $o->say(); // 将 $o 对象串行化 $str = serialize( $o ); // 将字符串保存到 str.txt 文件中 file_put_contents( 'str.txt', $str ); echo '保存成功!
'; // 文件 str.txt 中读取字符串 $str2 = file_get_contents( 'str.txt' ); // 反串行化 $p = unserialize( $str2 ); echo '读取成功!
'; $p->say(); /* 打印结果: 我叫xmoon,今年18岁 只串行化name和age 保存成功! 反串行化时调用 __wakeup() 读取成功! 我叫xmoon,今年20岁 释放了 释放了 */
数组的串行化
json JavaScript object
$arr = array('name'=>'Xmin', 'age'=>18, 'sex'-> '男' ); // 串行化 $str = json_encode( $arr ); // 反串行化 $str2 = json_decode( $str, true );
本文由 猫斯基 原创发布。
著作权均归用户本人所有。独家文章转载,请联系本站管理员。获得授权后,须注明本文地址! 本文地址:https://www.maosiji.com/2562.html