我对单例模型与静态模型如何处理数据库连接感到困惑。我的 friend 创建了一个“静态”类并向我展示了它,但它对它是如何静态的没有任何意义。我有点了解如何创建数据库连接的单例方法,但我不确定它是否符合我的目标。
我想做的主要事情是减少对 MYSQL 打开的连接数。我有一个类的函数经常安静地调用数据库,并且没有理由让它在每次有人请求需要数据库的东西时建立新连接。有人可以提供一个小示例类来使用单例或静态方法(以正确的方法为准)连接到数据库并显示一个小示例查询吗?我将不胜感激。
哦,是的,我正在使用 PHP 5.3 :) 请随时询问更多详细信息。
最佳答案
考虑以下使用单例设计模式访问数据库对象实例的示例。(这样做的目的是在整个应用程序中一次又一次地重用相同的连接)
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();
使用静态方法。这基本上是通过将构造函数声明为私有(private)来限制您直接实例化对象,而是检查对象是否已经实例化。如果为真则返回已经实例化的对象。否则创建新的并返回新创建的对象。这确保在整个应用程序中重复使用相同的数据库连接。
关于php - 静态类与单例类如何工作(数据库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10169198/