3

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

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

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

4

1 回答 1

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();使用静态方法。这基本上是通过将构造函数声明为私有来限制您直接实例化对象,而是检查对象是否已经实例化。如果为真则返回已经实例化的对象。否则创建新的并返回新创建的对象。这确保在整个应用程序中重用相同的数据库连接。

于 2012-04-16T05:48:45.530 回答