PDO с Singleton не может получить доступ к частной собственности

Я установил соединение с базой данных с PDO и одноэлементным шаблоном. Все работает нормально, пока у меня переменная $_db установлена ​​как общедоступная, но она должна быть частной … Когда я делаю это закрытым, я, конечно, получаю сообщение об ошибке: не могу получить доступ к частной базе данных :: $ _ 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. Таким образом, вам не нужно вызывать $ _db как общедоступную переменную.

О, я не могу больше терпеть эту статическую борьбу.

Вот мини-версия статического класса PDO @ nikic

 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() вам придется вручную отображать все методы PDO , как сказал ComFreek.