【问题标题】:PHP Magic Method __sleep and __wakeup and PDO connectionPHP 魔术方法 __sleep 和 __wakeup 和 PDO 连接
【发布时间】:2017-03-11 21:49:20
【问题描述】:

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

  1. 使用魔术方法建立PDO有什么好处 根据 PHP 手册中的此示例进行连接。不明白,为什么要使用serialize()__sleep()__wakeup() 建立数据库连接?
  2. 建立连接后的句柄 将在$link 变量中,我如何通过扩展它来使用它 带子班的班?
  3. 如何将 $link 传递给不会继承 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();
    }
}

【问题讨论】:

    标签: php oop pdo connection database-connection


    【解决方案1】:

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

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

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

    【讨论】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-29
        • 2011-06-10
        • 1970-01-01
        • 2015-07-23
        • 2015-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多