PHP魔术方法__sleep和__wake与PDO连接


PHP Magic Method __sleep and __wakeup and PDO connection

有人能解释一下这个php手册中的例子是如何工作的吗?在这里找到http://php.net/manual/en/language.oop5.magic.php

  1. 使用魔法方法建立PDO的好处是什么按照这个例子从PHP手册。我不明白,为什么我需要使用serialize()__sleep()__wakeup()建立数据库连接?
  2. 连接建立后处理它将在$link变量,我如何通过扩展它来使用它类和子类?
  3. 我如何传递$链接到其他类,不会继承Connection类,唯一的方法是使其static ?
  4. 我如何去关闭连接到PDO我应该关闭它在脚本执行已经结束或当对象连接被销毁?
x

class Connection {
    protected $link;
    private   $dsn, $username, $password;
    public function __construct($dsn, $username, $password) {
        $this->dsn      = $dsn;
        $this->username = $username;
        $this->password = $password;
        $this->connect();
    }
    private function connect() {
        $this->link = new PDO($this->dsn, $this->username, $this->password);
    }
    public function __sleep() {
        return array('dsn', 'username', 'password');
    }
    public function __wakeup() {
        $this->connect();
    }
}

PDO连接不会在不同的脚本执行之间持续存在,因此在序列化包含数据库连接的对象时尝试包含它们是没有意义的。因此,当您序列化和反序列化该类时,您需要以某种方式重新建立等效的连接。

如果您尝试将Connection对象保存在会话变量中,则可以使用

。PHP会话功能使用serialize()将数据转换为可以保存在文件或存储在数据库中的格式。

本例中的假设是Connection类是您进行所有数据库访问的方式。它们没有展示整个类的定义,只展示了这些神奇方法的用法。在实际应用程序中,您可能有一个返回$this->linkgetLink()方法,或者添加其他使用$this->link执行查询的方法。您还可以添加close()方法来执行$this->link = null; .

  1. 这是非常规的,但是__sleep会将您传递的凭据存储在序列化对象中,并且当您反序列化它时,__wakeup会重新建立它。需要注意的是,如果选择这个方法,存储在PHP脚本中的常量,存储序列化数据的任何地方都会包含DB凭据
  2. link确实存储了PDO对象
  3. 使用getter方法获取PDO对象

    public function getConnection() {
         return $this->link;
    }
    
  4. 在大多数情况下,你不需要关闭你的连接。当脚本关闭时,所有非显式持久的连接将被关闭。