<?
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()我做错了什么?
答案 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)
你必须
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();
应该可以正常工作