在OOP中关闭与数据库的连接的正确方法是什么?

时间:2019-07-14 22:54:37

标签: php database class oop pdo

我刚刚开始学习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;
}

1 个答案:

答案 0 :(得分:0)

您创建的是一个单例,并且您遇到了人们通常会遇到的一个问题:破坏该单例。

如果将$conn设置为null,则由于Db::$instance中剩余的引用,实际上并没有破坏该类。此外,由于您的变量Db::$instancestatic,并且您的Db类实际上从未实例化,因此您的第二个解决方案也将不起作用(由于逻辑上没有实例化,因此将无需调用析构函数。

最干净的方法是创建一个名称不同的方法,例如

public static function uninitialize() {
    static::$instance = NULL;
}

并在要取消实例化包含在单例中的PDO对象时调用此方法。