我刚刚开始学习OOP,关闭与数据库的连接的正确方法是什么?
这是我的课程:
class Db
{
private static $instance;
private static $host = 'localhost';
private static $db = 'database';
private static $charset = 'utf8';
private static $user = 'root';
private static $password = '';
public static function instance(){
if(NULL === self::$instance):
try{
self::$instance = new \PDO('mysql:host='.self::$host.';dbname='.self::$db.';charset='.self::$charset.';',self::$user,self::$password);
self::$instance->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
self::$instance->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
}catch(\PDOException $e){
die(printf('Error'));
}
endif;
return self::$instance;
}
}
在我的脚本开始时,我称呼此类:
$conn = Db::instance();
在脚本结尾处,我以这种方式关闭连接:
$conn = NULL;
关闭连接?还是只是摧毁物体?我应该将__destructor
添加到我的Db
类中吗?
public function __destruct(){
self::$instance = NULL;
}
答案 0 :(得分:0)
您创建的是一个单例,并且您遇到了人们通常会遇到的一个问题:破坏该单例。
如果将$conn
设置为null,则由于Db::$instance
中剩余的引用,实际上并没有破坏该类。此外,由于您的变量Db::$instance
为static
,并且您的Db
类实际上从未实例化,因此您的第二个解决方案也将不起作用(由于逻辑上没有实例化,因此将无需调用析构函数。
最干净的方法是创建一个名称不同的方法,例如
public static function uninitialize() {
static::$instance = NULL;
}
并在要取消实例化包含在单例中的PDO
对象时调用此方法。