2016-10-28 40 views
1

有人可以解释这个例子如何从PHP手册工作? 它发现这里http://php.net/manual/en/language.oop5.magic.phpPHP魔法__sleep和__wakeup和PDO连接

  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(); 
    } 
} 

回答

1

PDO连接不不同的脚本执行之间依然存在,所以它是没有意义的尝试序列化包含数据库连接的对象时,包括他们。所以当你序列化和反序列化这个类时,你需要一些重建等效连接的方法。

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

在这个例子中的假设是Connection类是你如何做你所有的数据库访问。他们没有展示整个类的定义,仅仅足以展示这些神奇方法的使用。在真实应用程序中,您可能有一个返回$this->linkgetLink()方法,或者您可以添加使用$this->link执行查询的其他方法。您也可以添加一个close()方法,它的确可以做到$this->link = null;

0
  1. 这是标新立异,但__sleep将存储在序列化对象的传递凭证和__wakeup重新建立它,当你反序列化它。要知道,如果你选择这种方法比,比如说,存储在你的PHP脚本常量的地方,任何地方,你存储序列化的数据将包含您的数据库凭据
  2. link确实存储PDO对象
  3. 只需使用一个getter方法获取PDO对象

    public function getConnection() { 
        return $this->link; 
    } 
    
  4. 在大多数情况下,您不需要关闭连接。当脚本关闭时,所有未明确执行的连接将被关闭