У меня есть несколько классов, которые выполняют некоторые вопросы MySQL и подготовленные заявления. Однако я потерян в том, как включить мой объект PDO в тех классах. Например, я хочу сделать что-то вроде этого:
<?php
$dbh = new PDO(...);
class Foo extends PDO {
public $dbh;
public function bar() {
$this->dbh->prepare('SELECT * FROM table');
$this->dbh->execute();
}
}
?>
К сожалению, это не работает. Кто-либо может предложить изящный способ сделать это? Спасибо за внимание. Извините я плохо знаком с этим, пожалуйста, оставьте любые комментарии, если Вы неясны о чем-нибудь, и я приложу все усилия, чтобы ответить!
Можно инстанцировать подключение к базе данных в классе, реализующем однокнопочный шаблон. Соединение будет выполнено один раз, и этот класс будет легко доступен для всех остальных ваших объектов / скриптов.
я использую класс с именем "Core" в следующем примере;
class Core
{
public $dbh; // handle of the db connexion
private static $instance;
private function __construct()
{
// building data source name from config
$dsn = 'pgsql:host=' . Config::read('db.host') .
';dbname=' . Config::read('db.basename') .
';port=' . Config::read('db.port') .
';connect_timeout=15';
// getting DB user from config
$user = Config::read('db.user');
// getting DB password from config
$password = Config::read('db.password');
$this->dbh = new PDO($dsn, $user, $password);
}
public static function getInstance()
{
if (!isset(self::$instance))
{
$object = __CLASS__;
self::$instance = new $object;
}
return self::$instance;
}
// others global functions
}
этот класс берет параметры из статического класса с именем "Config", где вы можете хранить вашу конфигурацию:
<?php
class Config
{
static $confArray;
public static function read($name)
{
return self::$confArray[$name];
}
public static function write($name, $value)
{
self::$confArray[$name] = $value;
}
}
// db
Config::write('db.host', '127.0.0.1');
Config::write('db.port', '5432');
Config::write('db.basename', 'mydb');
Config::write('db.user', 'myuser');
Config::write('db.password', 'mypassword');
во всех ваших скриптах/объектах вы просто должны получить экземпляр Core и затем запросить DB
$sql = "select login, email from users where id = :id";
try {
$core = Core::getInstance();
$stmt = $core->dbh->prepare($sql);
$stmt->bindParam(':id', $this->id, PDO::PARAM_INT);
if ($stmt->execute()) {
$o = $stmt->fetch(PDO::FETCH_OBJ);
// blablabla....
если вам нужна дополнительная информация об singleton, посмотрите PHP doc http://php.net/manual/en/language.oop5.patterns.php
$ DBH
Не в пределах объема FOO
, сделайте это вместо этого:
class Foo /*extends PDO*/
{
public $dbh;
public function __construct()
{
$dbh = new PDO(/*...*/);
}
public function bar()
{
$this->dbh->prepare('SELECT * FROM table');
return $this->dbh->execute();
}
}
также, Foo
не нужно расширить PDO
.