PHP 魔术方法 - __wakeup()
上一章节中我们已经见过了序列化函数 serialize()
,其实,与它功能相反的,还存在一个函数 unserialize()
,用来将 serialize()
序列化的结果反序列化回一个 PHP 对象,例如重建数据库连接,或其它的初始化操作。
例如下面的代码,将我们上一章节中序列化的字符串给反系列化回去。
<?php class Person { public $sex; public $name; public $age; public function __construct($name="", $age=25, $sex='Male') { $this->name = $name; $this->age = $age; $this->sex = $sex; } } $person = new Person('Yufei',30,'Male'); $s = serialize( $person ); echo $s,"\n"; $person2 = unserialize( $s ); echo $person2->name,"\n"; echo $person2->age,"\n"; echo "\n";
运行结果如下
[yufei@localhost php]$ php demo.php O:6:"Person":3:{s:3:"sex";s:4:"Male";s:4:"name";s:5:"Yufei";s:3:"age";i:30;} Yufei 30
但如果我们要再反序列化的时候修改某些数据,或创建一个数据库连接,或添加一些属性,要怎么做呢 ?
PHP 提供了 __wakeup()
魔术方法,当 unserialize()
反序列化一个对象成功后会自动调用该对象的定义的 __wakeup()
魔术方法,如果定义了的话。
魔法函数 __wakeup()
当使用 unserialize()
反序列化一个对象成功后,会自动调用该对象的 __wakup()
魔术方法。
该方法的原型如下
public function __wakeup() { // 一些其它初始化操作 }
该魔术方法既没有参数,也没有返回值
范例
下面的范例,我们再反序列化 person
对象的时候顺便给它添加一些额外的属性,例如 school
,同时也将年龄修改成 520
<?php class Person { public $sex; public $name; public $age; public function __construct($name="", $age=25, $sex='Male') { $this->name = $name; $this->age = $age; $this->sex = $sex; } public function __wakeup() { echo "但使用 unserialize() 方法反序列化一个对象后会自动调用该魔术方法\n"; $this->age = 520; $this->school = 'HuaQiao'; } } $person = new Person('Yufei',30,'Male'); $s = serialize( $person ); echo $s,"\n"; $person2 = unserialize( $s ); echo $person2->name,"\n"; echo $person2->age,"\n"; echo $person2->schoo,"\n";
运行结果如下
[yufei@localhost php]$ php demo.php O:6:"Person":3:{s:3:"sex";s:4:"Male";s:4:"name";s:5:"Yufei";s:3:"age";i:30;} 但使用 unserialize() 方法反序列化一个对象后会自动调用该魔术方法 Yufei 520