Ошибка в объявлении объекта при расширении класса PDO - PullRequest
0 голосов
/ 10 июня 2011

Я создал три класса. Один класс дБ, который расширяется от PDO. Два других класса происходят от класса БД. Но проблема в том, что когда я инициализирую объекты этих подклассов, второй объект создается как клон первого объекта. Заранее спасибо за любую помощь.

<?php
/** The Database Driver */
define('DB_DRIVER', 'mysql');

/** The name of the database */
define('DB_NAME', 'sample');

/** MySQL database username */
define('DB_USER', 'root');

/** MySQL database password */
define('DB_PASSWORD', 'root');

/** MySQL hostname */
define('DB_HOST', 'localhost');

class db extends PDO
{
    public function __construct()
    {
        echo "DB constructor called\n";
        $options = array(
            PDO::ATTR_PERSISTENT => true,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        );
        $dsn = DB_DRIVER . ":host=" . DB_HOST . ";dbname=" . DB_NAME;
        parent::__construct($dsn, DB_USER, DB_PASSWORD, $options);
    }
}

class Admin extends db
{
    private $uid, $username, $password, $level, $name, $email;

    public function __construct()
    {
        echo "Admin constructor called\n";
        parent::__construct();
    }
}

class Movie extends db
{
    private $mid, $title, $slug;

    public function __construct()
    {
        echo "Movie constructor called\n";
        parent::__construct();
    }
}


$adminObj = new Admin();
$movieObj = new Movie();
var_dump($adminObj);
var_dump($movieObj);
?>

Вот результат вышеупомянутого. Обратите внимание на тип объектов , отображаемых в выводе.

Admin constructor called
DB constructor called
Movie constructor called
DB constructor called
object(Admin)#1 (6) {
  ["uid":"Admin":private]=>
  NULL
  ["username":"Admin":private]=>
  NULL
  ["password":"Admin":private]=>
  NULL
  ["level":"Admin":private]=>
  NULL
  ["name":"Admin":private]=>
  NULL
  ["email":"Admin":private]=>
  NULL
}
object(Admin)#2 (6) {
  ["uid":"Admin":private]=>
  NULL
  ["username":"Admin":private]=>
  NULL
  ["password":"Admin":private]=>
  NULL
  ["level":"Admin":private]=>
  NULL
  ["name":"Admin":private]=>
  NULL
  ["email":"Admin":private]=>
  NULL

}


Когда создается родительская :: __ ($ dsn, DB_USER, DB_PASSWORD, $ options); в классе db удалена проблема исчезнет.

Ответы [ 2 ]

1 голос
/ 10 июня 2011

У вас есть PDO::ATTR_PERSISTENT => true,, и вы пытаетесь создать 2 объекта PDO с одинаковой строкой DSN.Это заставляет PDO возвращать уже установленное соединение, когда вы делаете $movieObj = new Movie(); вместо создания нового.

Решение в вашем случае: PDO::ATTR_PERSISTENT => false,

Полезная ссылка: Соединения и управление соединениями

Когда родительская конструкция :: __ ($ dsn, DB_USER, DB_PASSWORD, $ options);в классе БД проблема исчезнет.Да, потому что фактический объект PDO не будет создан в этом случае.

0 голосов
/ 10 июня 2011

Во-первых, это похоже на ошибку, и это, вероятно, связано с тем, как класс PDO внутренне обрабатывает постоянные соединения.То есть PHP не должен возвращать неправильный расширенный класс, но, вероятно, потому, что основной драйвер PDO не был разработан с учетом его расширения.

Я искал ошибки на bugs.php.net, и естьнекоторые перечислены.(например, поиск «pdo extension persistent»). См. # 47407 для чего-то похожего.

Все это говорит о том, что с вашей стороны это выглядит как плохой дизайн.Ваши классы должны обращаться к существующему объекту PDO:

$db = new DB();
$movie = new Movie($db);

Это будет работать с ошибкой PHP, но не менее важно ... она лучше разработана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...