Оболочка PDO возвращает NULL

#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() просто вызывает родительский конструктор вашего объекта. Будут установлены любые переменные, определенные в родительском элементе, и т.д. Он ничего не возвращает.