我与PDO和单例模式建立了数据库连接。
一切正常,只要我将$_db
变量设置为公共但它需要是私有的...当我将其设为私有时我当然得到错误:无法访问私有属性Database :: $ _db
有人可以告诉我如何将其设为私有且仍能获得实例吗?
当我从另一个文件调用数据库连接时,我调用函数getInstance()
以下是我从一个文件中调用它的示例:
$db = Database::getInstance();
$query = $db->_db->prepare("SELECT `password`, `id` FROM `users` WHERE `username` = ?");
这是我的数据库连接文件的样子:
class Database
{
private $_db;
static $_instance;
private function __construct()
{
$this->_db = new PDO('mysql:host=localhost;dbname=mvcuser', 'root', '');
$this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
private function __clone(){}
public static function getInstance()
{
if (!(self::$_instance instanceof self))
{
self::$_instance = new self();
}
return self::$_instance;
}
public function query($sql)
{
return $this->_db->query($sql);
}
}
答案 0 :(得分:1)
您无需撰写
$ db-> _db->
因为你已经在使用你班级的实例了。
在这里您可以参考您的DB类
$db = Database::getInstance();
每当您决定进行查询或仅使用$db->query();, $db->prepare();
查看代码:您已在DB类中使用$ _db引用。 因此,您不需要将$ _db称为公共变量。
答案 1 :(得分:1)
class DB
{
protected static $instance = null;
final private function __construct() {}
final private function __clone() {}
public static function instance()
{
if (self::$instance === null)
{
$dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME;
self::$instance = new PDO($dsn, DB_USER, DB_PASS);
self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
return self::$instance;
}
public static function __callStatic($method, $args) {
return call_user_func_array(array(self::instance(), $method), $args);
}
}
使用静态类应该是
的方式echo DB::query("SELECT 'foo'")->fetchColumn();
echo DB::lastInsertId();
如果没有__callStatic()
魔法,你将拥有to mirror all the PDO methods manually,就像ComFreek所说的那样。