mysqli和单身人士

时间:2012-09-15 09:38:01

标签: php singleton mysqli

<?
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();

?>

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

4 个答案:

答案 0 :(得分:2)

您正在课堂query()的某个对象上调用DbConn - 该方法没有任何query()方法。

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

答案 1 :(得分:1)

尝试在__construct功能

之后添加以下内容
public function query($sql)
{
    return $this->_db->query($sql);
}

然后尝试

DbConn::getInstance()->query("SELECT * FROM Table"); //Replace your sql

答案 2 :(得分:0)

你必须

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

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

答案 3 :(得分: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();应该可以正常工作