php - 在 php 中制作 mysql 单例数据库类的任何更简单/更好的方法?

标签 php mysql class singleton

这是我正在使用的:

<?php
final class Database {
    private static $oDb;
    public static function init() {
        if(self::$oDb == NULL)
        {
            self::$oDb = mysql_connect('localhost', 'mysql_user', 'mysql_password') or die(mysql_error());
            mysql_select_db('mysql_db_name', self::$oDb) or die (mysql_error());;
        }
        return self::$oDb;
    }
    public function query($sql)
    {
        return mysql_query($sql) or die(mysql_error());
    }
}
?>

用法:

$oDb = Database::init();
$sql = foo;
$oDb->query($sql);

假设我只希望它连接并执行这一个查询功能,我应该在类上做些什么改进?内存还是代码效率?

此外,是否有一种有效的方法可以从配置文件中获取数据库凭据?我知道我不能在类里面使用 include。

最佳答案

我通常在这种情况下使用惰性初始化,并且只有一个公共(public)方法(在这种情况下),带有一个私有(private)构造函数以防止外部实例化(根据单例模式):

class Database {
  private static $instance;
  private $conn;

  private function Database() {
    // do init stuff
    require_once('dbconfig.php'); // contains define('DB_USER', 'webuser'); etc...
    $this->conn = mysql_connect(DB_HOST, DB_USER, DB_PASS); // do error checking
  }

  public static function getInstance() {
    if(!self::$instance) {
      self::$instance = new Database();
    }
    return self::$instance;
  }

  public static function query($sql) {
    $instance = self::getInstance();
    return mysql_query($sql, $instance->conn);
  }
}

然后您可以在任何需要使用它的时候调用$dbHandle = Database::getInstance()。或者在这种情况下,由于定义了静态查询方法,您可以使用 Database::query("select * from xx;"); 而无需调用任何类型的 init。

关于php - 在 php 中制作 mysql 单例数据库类的任何更简单/更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2018444/

相关文章:

MySQL NodeJS Openshift 服务器 - 对数据库的查询似乎不起作用

php - 一个页面上的多个 MySQL/PHP 查询,不公平!

C++11 在类中放置枚举类的重载运算符

class - 使用 Sed 和字符类从大写到小写

PHP 相当于 Objective-C 的 @"string"

php - Laravel Eloquent 显示查询日志

php - "MySQL server has gone away"使用 PHP 连接到服务器时

Java 泛型,创建 Class<T> 的实例

当我对 PHP 数组进行硬编码时,它与从 mysql 获取它时不一样

PHP 包括文件 2 目录返回