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

3
我对单例模式和静态模式在数据库连接方面的操作方式感到困惑。我的朋友创建了一个“静态”类,并向我展示它,但我不明白它是如何静态的。我有点理解如何使用单例方法创建数据库连接,但我不确定它是否符合我的目标。
我主要想做的是减少对MYSQL打开的连接数。我有一个包含经常调用数据库的函数的类,没有必要每次有人请求需要数据库时都建立一个新的连接。请问是否可以提供一个小例子类来演示这个使用单例或静态方法(哪种是正确的方法)连接到数据库并显示一个小样本查询?非常感谢。
哦,是的,我正在使用PHP 5.3 :) 请随时索取附加详细信息。
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();使用静态方法。这基本上限制了您通过声明构造函数为私有来直接实例化对象,而是检查对象是否已经实例化。如果为真,则返回已实例化的对象。否则创建新对象并返回新创建的对象。这确保在整个应用程序中重复使用相同的数据库连接。


取决于您的应用程序架构以及如何使用它。如果您正在使用一个应用程序,该应用程序一遍又一遍地使用相同的类,则连接将在整个应用程序中被重复使用。 - Ibrahim Azhar Armar
如果我有以下代码 class A { $db = Database::getInstance(); $db->query("SELECT * FROM TABLE WHERE ID = 1"); }那么这会为所有客户端使用相同的数据库连接吗? - MasterGberry
我建议您不要使用第三方库或原始的SQL连接,而是尝试使用PDO。您会喜欢它的处理方式,主要是因为它是面向对象的。这里有一个教程可以帮助您入门:http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/ :) - Ibrahim Azhar Armar
我已经明确表示,该类无论何时和如何调用,都不会创建两个连接。只要您从同一类中调用连接。 - Ibrahim Azhar Armar
我有点困惑为什么我之前做的回声测试导致连接被多次打开,不过没关系,我会接受你的答案,你提供了很多信息。 :) - MasterGberry
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接