有人能解释一下php手册中的这个例子是如何工作的吗? 它在http://php.net/manual/en/language.oop5.magic.php
找到了__sleep()
和__wakeup()
以及$link
来建立数据库连接?Connection
变量中,如何通过扩展它来使用它
有班级的班级? 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();
}
}
?X
function setInput(){
document.getElementById("input_box").innerHTML ="<input id='ProjectName'/>";
$(document).ready(function(){
$( '#ProjectName' ).autocomplete({
source: 'data.php'
});
})
}<br/>
setInput();
答案 0 :(得分:1)
PDO连接不会在不同的脚本执行之间保持不变,因此在序列化包含数据库连接的对象时尝试包含它们没有意义。因此,当您序列化和反序列化此类时,您需要某种方法来重新建立等效连接。
如果您尝试将Connection
对象保存在会话变量中,可以使用它的示例。 PHP会话工具使用serialize()
将数据转换为可以保存在文件中或存储在数据库中的格式。
此示例中的假设是Connection
类是您执行所有数据库访问的方式。他们没有展示全班定义,只是足以证明这些魔术方法的使用。在实际应用程序中,您可能有getLink()
方法返回$this->link
,或者您将添加使用$this->link
执行查询的其他方法。您还可以添加close()
的{{1}}方法。
答案 1 :(得分:0)
__sleep
会将您传递的凭据存储在序列化对象中,__wakeup
会在您反序列化时重新建立它。请注意,如果您选择此方法,比如存储在PHP脚本中的常量,则存储序列化数据的任何位置都将包含您的数据库凭据link
确实存储了PDO
对象只需使用getter方法获取PDO
对象
public function getConnection() {
return $this->link;
}