php - 静态类与单例类如何工作(数据库)

标签 php mysql database static singleton

我对单例模型与静态模型如何处理数据库连接感到困惑。我的 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/

相关文章:

php - 对很长的列表进行地理编码

php - Laravel:在 DDBB 上添加新列而不删除数据

mysql - 我可以简化这个 MySQL 查询吗?

c# - 如何从 Entity Framework 中的 .edmx 文件生成数据库?

java - 从 SQL 数据库中删除条目后出现空指针异常

php - 在数据库中存储大量标记的最佳方法是什么?

javascript - 检索和使用 json 关联数组

php - 挑战 - 安全而准确地逃离此文本

php - 上传文件并使用 file_get_contents php 读取

java - 从 java.sql.SQLIntegrityConstraintViolationException 中提取约束名称