2012-09-15 112 views
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(); 

?> 

我只是学习,知道我得Singleton模式,我试着用单使自己的数据库连接类,但是当我试图执行它,它给调用DbConn时的错误: :的getInstance() - >查询();说调用未定义的方法DbConn :: query()我做错了什么?的mysqli和辛格尔顿

+0

重要错误?它指向PHP或其他什么? – Diego

回答

1

尝试__construct功能

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

后加入以下然后尝试

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

您正在致电query()DbConn类 - 这没有任何query()方法的对象。

单例模式的实现在你的例子中是很好的。但你不能直接调用DbConn对象的mysqli功能,你必须包装他们或为私营_db属性为getter,并在对象调用query()

+0

你是什么意思? –

+0

我的意思就像你接受的答案一样。 – gd1

0

你必须

  • 扩展的mysqli类中使用的方法从该类
  • 或编写一个查询方法自己。
  • 或使$ DB公众和使用DbConn::getInstance()->$db->query();

为什么让一个Singleton? mysqli做连接池,并使其成为一个单身人士添加额外的复杂性没有任何好处。

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();应该工作