#php #mysql #class #pdo #wrapper
#php #mysql #класс #pdo #оболочка
Вопрос:
В моем конструкторе для оболочки PDO установлена следующая инициализация PDO:
public function __construct($engine, $host, $username, $password, $dbName)
{
$this->host = $host;
$this->dsn = $engine.':dbname='.$dbName.';host='.$host;
$this->dbh = parent::__construct($this->dsn, $username, $password);
$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
}
Моя основная проблема заключается в том, что когда я устанавливаю dbh для инициализации в качестве родительского элемента в конструкторе, он возвращается NULL
.
и это создает цепную реакцию.
Есть ли что-то конкретное, что я делаю неправильно?
Ответ №1:
Вы путаете обертывание класса и наследование класса.
Либо сделайте это (перенос):
class YourDB
{
public function __construct($engine, $host, $username, $password, $dbName)
{
$this->host = $host;
$this->dsn = $engine.':dbname='.$dbName.';host='.$host;
// here we are wrapping a PDO instance;
$this->dbh = new PDO($this->dsn, $username, $password);
$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
}
// possibly create proxy methods to the wrapped PDO object methods
}
Или (наследование):
class YourDB
extends PDO // extending PDO, and thus inheriting from it
{
public function __construct($engine, $host, $username, $password, $dbName)
{
$this->host = $host;
$this->dsn = $engine.':dbname='.$dbName.';host='.$host;
// here we are calling the constructor of our inherited class
parent::_construct($this->dsn, $username, $password);
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
}
// possibly override inherited PDO methods
}
Ответ №2:
Вы не понимаете parent::__construct()
вызов.
Вызов parent::__construct()
ничего не возвращает:
<?php
class Obj {
public $deja;
public function __construct() {
$this->deja = "Constructed";
}
}
$obj = new Obj();
class eObj extends Obj {
public $parent;
public function __construct() {
$this->parent = parent::__construct();
}
}
$eObj = new eObj();
if($eObj->parent==null) {
echo "I'm null";
echo $eObj->deja; // outputs Constructed
}
?>
Вызов parent::__construct()
просто вызывает родительский конструктор вашего объекта. Будут установлены любые переменные, определенные в родительском элементе, и т.д. Он ничего не возвращает.