繁体   English   中英

具有Singleton的PDO无法访问私有财产

[英]PDO with Singleton cannot access private property

我已经与PDO和单例模式建立了数据库连接。 只要将$_db变量设置为public,一切都可以正常工作,但是需要将其设为私有...当我将其设为私有时,我当然会走错误:无法访问私有属性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);
    }
}

你不用写

$ DB - > _ DB->
因为您已经在使用类的实例。

在这里,您可以参考您的数据库类

$db = Database::getInstance();

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

查看您的代码:您已经在数据库类中使用$ _db引用。 因此,您无需将$ _db称为公共变量。

哦,我再也受不了那些静态的斗争。

这是@nikic的静态PDO类的简化版本

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()魔术,则必须像ComFreek所说的那样手动镜像所有PDO方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM