0
<?
class DbConn {
    const DB_HOST = 'localhost';
    const DB_USER = 'root';
    const DB_PASS = 'pw';
    const DB_NAME = 'db';

    static private $instance = NULL;
    private $_db;

    static function getInstance()
    {
      if (self::$instance == NULL)
      {
        self::$instance = new DbConn();
        if(mysqli_connect_errno()) {
            throw new Exception("Database connection failed: ".mysqli_connect_error());
        }
      }
      return self::$instance;
    }

    private function __construct()
    {
        $this->_db = new mysqli(self::DB_HOST, self::DB_USER, self::DB_PASS, self::DB_NAME) or die('Couldnt connect');
    }

    private function __clone() {}

}

DbConn::getInstance()->query();

?>

我刚刚学习并且知道我必须使用单例模式,我尝试使用单例创建自己的 DBConnect 类,但是当我尝试执行它时,调用 DbConn::getInstance()->query() 时会出错; 说调用未定义的方法 DbConn::query() 我做错了什么?

4

4 回答 4

2

你正在调用query()一个类的对象DbConn——它没有任何query()方法。

在您的示例中,单例模式的实现很好。但是您不能直接调用对象mysqli上的函数DbConn,您必须包装它们或为私有属性提供 getter _db,然后调用query()对象

于 2012-09-15T09:40:24.190 回答
1

__construct尝试在函数后添加以下内容

public function query($sql)
{
    return $this->_db->query($sql);
}

然后尝试

DbConn::getInstance()->query("SELECT * FROM Table"); //Replace your sql
于 2012-09-15T09:53:07.243 回答
0

你必须

  • 扩展 mysqli 类以使用该类中的方法
  • 或者自己写一个查询方法。
  • 或公开 $db 并使用DbConn::getInstance()->$db->query();

为什么要让它成为单例?mysqli进行连接池,并使其成为单例增加了额外的复杂性而没有任何好处。

于 2012-09-15T09:43:03.470 回答
0

我对此很陌生,如果我错了,请纠正我。

你不能简单地扩展 mysqli 类并稍微改变一下构造函数吗?

class DbConn {

变成

class DbConn extends mysqli {


和:

$this->_db = new mysqli(
    self::DB_HOST, 
    self::DB_USER, 
    self::DB_PASS, 
    self::DB_NAME) or die('Couldnt connect');

变成

parent::__construct(
    self::DB_HOST, 
    self::DB_USER, 
    self::DB_PASS, 
    self::DB_NAME) or die('Couldnt connect');


现在,DbConn::getInstance()->query();应该工作

于 2012-12-06T19:13:55.603 回答