Php 具有单例的PDO无法访问私有属性

Php 具有单例的PDO无法访问私有属性,php,pdo,singleton,Php,Pdo,Singleton,我用PDO和singleton模式建立了一个数据库连接。 只要我将$\u db变量设置为public,一切正常,但它需要是私有的。。。当我将其设置为私有时,我会意外地得到错误:无法访问私有属性数据库::$\u db 有人能告诉我如何使它私有化并且仍然能够获得一个实例吗 当我从另一个文件调用数据库连接时,我调用函数getInstance() 下面是我如何从一个文件中调用它的示例: $db = Database::getInstance(); $query = $db->_db->pre

我用PDO和singleton模式建立了一个数据库连接。 只要我将
$\u db
变量设置为public,一切正常,但它需要是私有的。。。当我将其设置为私有时,我会意外地得到错误:无法访问私有属性数据库::$\u 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->\u db->
因为您已经在使用类的实例

这里有一个DB类的参考

$db = Database::getInstance();
每次决定进行查询或其他操作时,请仅使用
$db->query()$db->prepare()

看看您的代码:您已经在db类中使用了$\u db引用。
因此,您不需要将$\u db作为公共变量调用。

哦,我再也无法忍受所有这些静态斗争了

这是一个缩小版的

使用静态类应该使用的方式

echo DB::query("SELECT 'foo'")->fetchColumn();
echo DB::lastInsertId();

如果没有这个
\uu callStatic()
魔术,就像康弗里克所说的那样。

,这是一个任务,所以不是我的选择。。。但是出于好奇,为什么不呢@Touki你可以检查隐藏在每个单词中的链接,知道为什么你不应该感谢刚刚注意到的:)@Touki仍然需要解决我的问题:(呃……你完全明白,“受保护”是什么意思吗?
$db->prepare()
将失败,因为在
数据库中没有这样的方法。当然不是,它作为适配器工作。您需要创建一个方法prepare(),并在类$this->_db->prepare()内调用它;我已经编写了(或一些仅限使用的东西),所以没有理由对我投反对票。我不知道为什么有些人总是认为,如果他们只是对那篇文章发表评论,他们就投了反对票!我没有对你投反对票。明白了!谢谢!我还添加了一个prepare()方法,效果非常好!@ComFreek
echo DB::query("SELECT 'foo'")->fetchColumn();
echo DB::lastInsertId();