静态与单例类的工作原理(数据库)

时间:2012-04-16 05:43:05

标签: php mysql database static singleton

我对单例模型与静态模型如何用于数据库连接感到困惑。我的朋友创建了一个“静态”类并向我展示了它,但它对静态如何没有任何意义。我有点理解如何创建数据库连接的单例方法,但我不确定它是否符合我的目标。

我想做的主要是减少打开到MYSQL的连接数。我有一个带有一个函数的类,它经常调用数据库安静,并且没有理由每次有人请求需要数据库的东西时都建立新的连接。有人可以提供一个小的示例类,使用单例或静态方法(无论哪种方法是正确的)连接到数据库并显示一个小样本查询?我将不胜感激。

哦是的,我使用的是PHP 5.3 :)请随时询问其他详细信息。

1 个答案:

答案 0 :(得分:5)

考虑以下使用单例设计模式访问数据库对象实例的示例。(目的是在应用程序中一次又一次地重用相同的连接)

class Database {

    protected static $_dbh;
    const HOST = 'localhost';
    const DATABASE = 'dbname';
    const USERNAME = 'username';
    const PASSWORD = 'password';

    //declare the constructor as private to avoid direct instantiation.   
    private function __construct() { }

    //access the database object through the getInstance method.
    public static function getInstance() {
        if(!isset($_dbh)) {
            #Connection String.
            self::$_dbh = new PDO('mysql:host='.self::HOST.';dbname='.self::DATABASE,self::USERNAME,self::PASSWORD);
            self::$_dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        return self::$_dbh;
    }
}

现在,如果我必须在应用程序的任何地方使用该类,我会这样做很简单。

require_once('database.php');
$dbh = Database::getInstance();
$sth = $dbh->query('SELECT * FROM sometable');
$result = $sth->fetchAll(PDO::FETCH_ASSOC);

Database::getInstance();的调用使用静态方法。这基本上做的是它通过将构造函数声明为私有来限制您直接实例化对象,而是检查对象是否已经实例化。如果为true则返回已经实例化的对象。 else创建new并返回新创建的对象。这可以确保在整个应用程序中重用相同的数据库连接。