PHP Magic Method __sleep和__wakeup以及PDO连接

时间:2016-10-28 23:45:30

标签: php oop pdo connection database-connection

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

找到了
  1. 使用魔术方法建立PDO有什么好处 根据PHP手册中的示例连接。我不明白,为什么我需要使用__sleep()__wakeup()以及$link来建立数据库连接?
  2. 建立连接后处理它 将在Connection变量中,如何通过扩展它来使用它 有班级的班级?
  3. 如何将$ link传递给不会继承static类的其他类,唯一的方法是将其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(); } }
  4. 如果在脚本执行结束或对象连接被销毁时关闭它,我如何关闭与PDO的连接?
  5. X

    function setInput(){
        document.getElementById("input_box").innerHTML ="<input id='ProjectName'/>";
        $(document).ready(function(){
            $( '#ProjectName' ).autocomplete({
                source: 'data.php'
            });
        })
    }<br/>
    setInput();
    

2 个答案:

答案 0 :(得分:1)

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

如果您尝试将Connection对象保存在会话变量中,可以使用它的示例。 PHP会话工具使用serialize()将数据转换为可以保存在文件中或存储在数据库中的格式。

此示例中的假设是Connection类是您执行所有数据库访问的方式。他们没有展示全班定义,只是足以证明这些魔术方法的使用。在实际应用程序中,您可能有getLink()方法返回$this->link,或者您将添加使用$this->link执行查询的其他方法。您还可以添加close()的{​​{1}}方法。

答案 1 :(得分:0)

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

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