首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__sleep与__wakeup与PDO连接

__sleep与__wakeup与PDO连接
EN

Stack Overflow用户
提问于 2016-10-28 23:45:30
回答 2查看 1.2K关注 0票数 1

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

  1. 根据PHP手册中的示例,使用神奇方法建立PDO连接的好处是什么?我不明白,为什么我需要使用serialize()__sleep()__wakeup()来建立数据库连接?
  2. 在连接建立之后,句柄将在$link变量中,我如何通过用子类扩展这个类来使用它?
  3. 如何将$link传递给其他不继承Connection类的类,唯一的方法是使其成为static
  4. 如何关闭与PDO的连接,在脚本执行已经结束或对象连接被破坏时关闭它?

X

代码语言:javascript
复制
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();
    }
}
EN

回答 2

Stack Overflow用户

发布于 2016-10-29 00:04:13

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2016-10-29 00:09:20

  1. 这是非常规的,但是__sleep会将您传递的凭据存储在序列化对象中,当您反序列化它时,__wakeup会重新建立它。请注意,如果选择此方法,例如,存储在PHP脚本中的常量,存储序列化数据的任何地方都将包含DB凭据
  2. link确实存储了PDO对象
  3. 只需使用getter方法获取PDO对象 公共函数getConnection() {返回$this->link;}
  4. 在大多数情况下,您不需要关闭连接。所有未显式持久的连接将在脚本关闭时关闭。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40314618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档