1

根据文档:

unserialize() 检查是否存在具有魔术名称 __wakeup() 的函数。如果存在,此函数可以重建对象可能拥有的任何资源。

__wakeup() 的预期用途是重新建立在序列化期间可能丢失的任何数据库连接并执行其他重新初始化任务。

如果我的对象没有定义__wakeup()方法,我仍然可以使用重建对象的形式,unserialize()那么为什么 PHP 中有这个神奇的方法?

文档也说__wakeup()函数可以重建对象可能拥有的任何资源unserialize()

__wakeup()在反序列化开始之前或反序列化完成之后何时调用此魔术方法?

4

1 回答 1

1

也许这段代码可以帮助你,当你序列化一个对象实例时,数据库连接关闭并且没有以序列化形式保存,当你反序列化这个对象时 __wakeup() 方法在反序列化时重新建立数据库连接,所以你可以使用这些资源 inmediatly,您可以在反序列化时看到 $objTest->getUserInfo() 的使用。您可以使用 __wakeup 进行微积分或打开文件连接等...

class Test
{
    public $userId;

    private $_db = null;

    public function __wakeup()
    {
        if (null === $this->_db)
        {
            $this->_db = getConnection();
        }
    }

    public function getUserInfo(){
        $info = $this->_db->query("SELECT * FROM users WHERE id = " . intval($this->userId, 10));
        return $info;
    }
}

function getConnection(){
    $user = "my_user_db";
    $password = "my_password_db";
    return new PDO('mysql:host=my_host_db;dbname=my_database', $user, $password);
}

$objTest = unserialize("O:4:\"Test\":2:{s:6:\"userId\";s:2:\"43\";s:9:\" Test _db\";N;}", ['Test']);
$userInfo = $objTest->getUserInfo();
于 2017-12-08T05:35:00.420 回答