串行化/序列化:将对象转成字符串。
反串行化/反序列化:将字符串转成对象。
串行化时机:
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 );