使用Singleton的PDO无法访问私有财产

时间:2013-11-20 16:14:19

标签: php pdo singleton

我与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);
    }
}

2 个答案:

答案 0 :(得分:1)

您无需撰写

$ db-> _db->
因为你已经在使用你班级的实例了。

在这里您可以参考您的DB类

$db = Database::getInstance();

每当您决定进行查询或仅使用$db->query();, $db->prepare();

查看代码:您已在DB类中使用$ _db引用。 因此,您不需要将$ _db称为公共变量。

答案 1 :(得分:1)

噢,我不能忍受所有的静止斗争了。

以下是@nikic's static PDO class

的缩小版本
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所说的那样。