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
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.