PHP 对象/数组 串行化 序列化 __sleep() __wakeup() json_encode() json_decode()

猫斯基  — PHP


串行化/序列化:将对象转成字符串。

反串行化/反序列化:将字符串转成对象。

串行化时机:

1、将对象在网络中传输

2、将对象持久保存

serialize() 串行化

unserialize() 反串行化

__sleep() 串行化时自动调用的魔术方法。可以设置需要串行化的对象的属性。只要在此方法中返回一个声明了属性名的数组,那么这个属性名就会被串行化;没有声明的属性名,则不会被串行化;不加这个魔术函数,则都被串行化。

__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 '说<br>';
	}
	
	function __destruct() {
		echo '释放了<br>';
	}
	
}

$o = Person::getObj();
$o->say();

// 将 $o 对象串行化
$str = serialize( $o );
// 将字符串保存到 str.txt 文件中
file_put_contents( 'str.txt', $str );
echo '保存成功!<br>';

//  文件 str.txt 中读取字符串
$str2 = file_get_contents( 'str.txt' );
// 反串行化
$p = unserialize( $str2 );
echo '读取成功!<br>';
$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}岁<br>";
	}
	
	function __sleep() {
		echo '只串行化name和age<br>';
		return array('name', 'age');
	}
	
	function __wakeup() {
		echo '反串行化时调用 __wakeup()<br>';
		$this->age = 20;
	}
	
	function __destruct() {
		echo '释放了<br>';
	}
	
}

$o = new Person( 'xmoon', 18, '男' );
$o->say();

// 将 $o 对象串行化
$str = serialize( $o );
// 将字符串保存到 str.txt 文件中
file_put_contents( 'str.txt', $str );
echo '保存成功!<br>';

//  文件 str.txt 中读取字符串
$str2 = file_get_contents( 'str.txt' );
// 反串行化
$p = unserialize( $str2 );
echo '读取成功!<br>';
$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 );

阅读量:0 2021-01-23 17:35

返回顶部