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