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

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

        class db extends PDO {
    public function __construct() {
            echo "DB constructor called\n";
            ..
    }
        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();
}

$base_path = "../../";

require $base_path . 'config.php';
require $base_path . 'lib/class.db.php';
require $base_path . 'lib/Admin.php';
require $base_path . 'lib/Movie.php';

$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 (11) {
  ["uid":"Admin":private]=>
  NULL
  ["username":"Admin":private]=>
  NULL
  ["password":"Admin":private]=>
  NULL
  ["level":"Admin":private]=>
  NULL
  ["name":"Admin":private]=>
  NULL
  ["email":"Admin":private]=>
  NULL
  ["error":"db":private]=>
  NULL
  ["sql":"db":private]=>
  NULL
  ["bind":"db":private]=>
  NULL
  ["errorCallbackFunction":"db":private]=>
  NULL
  ["errorMsgFormat":"db":private]=>
  NULL
}
object(Admin)#2 (11) {
  ["uid":"Admin":private]=>
  NULL
  ["username":"Admin":private]=>
  NULL
  ["password":"Admin":private]=>
  NULL
  ["level":"Admin":private]=>
  NULL
  ["name":"Admin":private]=>
  NULL
  ["email":"Admin":private]=>
  NULL
  ["error":"db":private]=>
  NULL
  ["sql":"db":private]=>
  NULL
  ["bind":"db":private]=>
  NULL
  ["errorCallbackFunction":"db":private]=>
  NULL
  ["errorMsgFormat":"db":private]=>
  NULL
}

Модифицированный код, пожалуйста, проанализируйте это.Когда конструкция parent :: __ ($ dsn, DB_USER, DB_PASSWORD, $ options);в классе db удалена проблема исчезнет.

<?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);
?>

Ответы [ 3 ]

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

Если вы хотите предотвратить 2 экземпляра PDO, используйте Singleton pattern

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

Я не вижу проблем вообще - вывод точно такой, как ожидалось. Так что это должно быть ошибка где-то еще в файлах, которые вы включаете. Вот автономный код теста:

<?php
class db extends PDO
{
    public function __construct()
    {
        echo "DB constructor called\n";
    }
}

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(Movie)#2 (3) {
  ["mid":"Movie":private]=>
  NULL
  ["title":"Movie":private]=>
  NULL
  ["slug":"Movie":private]=>
  NULL
}

Поэтому, пожалуйста, проверьте ваш фактический код. Возможно (просто возможно) вы включили не тот файл ... или второй класс был объявлен в другом месте (и вы, возможно, редактируете неправильный файл) ...

EDIT: Алекс, спасибо за предоставление дополнительной информации. У меня есть проблема в вашем обновленном коде: PDO::ATTR_PERSISTENT => true, - измените true на false и увидите разницу:)

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

Они не клоны.Они оба наследуют от класса db, и вы не внесли в них никаких изменений.Они не клоны - они просто идентичны.

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