Alt*_*ini 3 php mysql oop singleton pdo
这是我的课:
class MySQLDB extends PDO{
private $_connection;
private static $_instance; //The single instance
private $_host = MYSQL_SERVER_NAME;
private $_username = MYSQL_SERVER_USERNAME;
private $_password = MYSQL_SERVER_PASSWORD;
private $_database = MYSQL_SERVER_DBNAME;
/*
Get an instance of the MySQLDB
@return Instance
*/
public static function getInstance() {
if(!self::$_instance) { // If no instance then make one
self::$_instance = new self();
}
return self::$_instance;
}
// Get PDO MySQL connection
public function getConnection() {
return $this->_connection;
}
public function __construct(){
try {
$this->_connection = new PDO("mysql:host={$this->_host};dbname={$this->_database};charset=utf8", $this->_username, $this->_password);
$this->_connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->_connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
}
catch(PDOException $e) {
throw new Exception($e->getMessage());
}
}
public function __destruct(){
// unset($this->_connection);
self::$_instance = null;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的主要内容:
$db = MySQLDB::getInstance();
$db->__destruct();
print_r($db).'<br /><br />';
Run Code Online (Sandbox Code Playgroud)
这是输出:
MySQLDB Object ( [_host:MySQLDB:private] => localhost [_username:MySQLDB:private] => username [_password:MySQLDB:private] => [_database:MySQLDB:private] => dbname )
Run Code Online (Sandbox Code Playgroud)
我的问题:为什么我会得到这个输出?如果我像上面那样调用 __destruct() 方法,我不应该只得到一个空输出 - 因为我正在清空实例吗?
或者也许我应该在 main 中使用它:
$db = null;
print_r($db).'<br /><br />';
Run Code Online (Sandbox Code Playgroud)
我如何确保我已经关闭了连接并杀死了对象?
不,$db->__destruct()只是调用__destruct() 方法。它不会神奇地取消设置变量。
析构函数的工作周围的其他方法:当物体被由垃圾回收后没有变量引用它了,破坏了那么析构函数会被自动调用。
你想要做的是:
unset($db);
Run Code Online (Sandbox Code Playgroud)
但请注意,不能保证在那一刻调用析构函数。首先,该对象不得分配给任何其他变量,其次,定期执行清理未引用对象的垃圾收集器,而不是在每个命令之后执行。
在您的情况下,该对象仍由MySQLDB::$_instance. 如果您改变了当前的__destruct方法,取消设置self::$_instance一个静态方法resetInstance(),你可以使用:
MySQLDB::resetInstance();
unset($db);
Run Code Online (Sandbox Code Playgroud)
然后两个引用都消失了,最终将调用析构函数(同样,如果对象上没有其他引用)。
有关引用计数主题的更多信息可以在垃圾收集器手册中找到:http : //php.net/manual/de/features.gc.refcounting-basics.php
| 归档时间: |
|
| 查看次数: |
1167 次 |
| 最近记录: |