Я установил соединение с базой данных с 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.