在 PHP 进行序列化时会用到__sleep()和__wakeup()这两个构造函数.
序列化即将一个变量或者一个对象转换成字节流的过程. 序列化有效的解决了对象的保存和传输问题, 例如:在使用 session 并使用了 session_register() 函数来注册对象, 这些对象会在每个 PHP 页面结束时被自动序列化, 并在接下来的每个页面中自动解序列化, 这样在每个 PHP 页面中都可以使用这些对象
03 | echo serialize( $var ). "\n" ; |
07 | echo serialize( $var ). "\n" ; |
10 | $var = "This is a string" ; |
11 | echo serialize( $var ). "\n" ; |
15 | echo serialize( $var ). "\n" ; |
18 | $var = array ( "abc" , "def" , "xyz" , "123" ); |
19 | echo serialize( $var ). "\n" ; |
21 | $var = array ( "index1" => "abc" , "index2" => "def" , "index3" => "xyz" , "index4" => "123" ); |
22 | echo serialize( $var ). "\n" ; |
26 | public $a = "a string" ; |
31 | $str = serialize( $obj ); |
33 | $obj2 = unserialize( $str ); |
34 | var_dump( $obj2 == $obj ); |
程序运行时, serialize() 检查类中是否有 __sleep() ,如果有,则该函数将在任何序列化之前运行. 该函数必须返回一个需要进行序列化保存的成员属性数组,并且只序列化该函数返回的这些成员属性. 该函数有两个作用: 第一. 在序列化之前,关闭对象可能具有的任何数据库连接等. 第二. 指定对象中需要被序列化的成员属性,如果某个属性比较大而不需要储存下来,可以不把它写进__sleep()要返回的数组中,这样该属性就不会被序列化
__sleep() 方法常被用于提交未提交的数据, 或者类似的操作.
与 __sleep() 方法相反的情况, unserialize() 函数会检测是否存在 __wakeup() 函数, 如果存在会先调用 __wakeup(), 预先准备对象数据. 在用 unserialize()时需要注意的一个问题: 在一个PHP页面中要 unserialize() 一个对象,需要该页面包含该对象的类的定义.也就是,如果序列化了 page1.php 中类 A 的对象 $a, 要在 page2.php 中将其反序列化重建类 A 的对象 $a, 则 page2.php 中必须要出现类 A 的定义. 这可以这样实现,将类 A 的定义放在一个包含文件中,并在 page1.php 和 page2.php 都包含此文件. 所以强烈建议在所有的页面中都包括这些注册的对象的类的定义, 即使并不是在所有的页面中都用到了这些类. 如果没有这样做, 一个对象被反序列化了但却没有其类的定义,它将失去与之关联的类并成为 stdClass 的一个对象而完全没有任何可用的函数。
17 | $fp = fopen ( "store" , "w" ); |
24 | $s = implode( "" , @file( "store" )); |
__wakeup() 方法经常用在反序列化操作中, 例如重新建立数据库连接,或其他的初始化工作.
例子:
03 | private $server , $username , $password , $db ; |
05 | public function __construct( $server , $username , $password , $db ) |
07 | $this ->server = $server ; |
08 | $this ->username = $username ; |
09 | $this ->password = $password ; |
14 | private function connect() |
16 | $this ->link = mysql_connect( $this ->server, $this ->username, $this ->password); |
17 | mysql_select_db( $this ->db, $this ->link); |
20 | public function __sleep() |
22 | return array ( 'server' , 'username' , 'password' , 'db' ); |
25 | public function __wakeup() |