Php 使用继承时对象声明中出错

Php 使用继承时对象声明中出错,php,oop,class,constructor,Php,Oop,Class,Constructor,我用了三节课。两个类扩展了第三个类db。但问题是,当我声明这些类的对象时,第二个对象被创建为第一个对象的克隆。提前感谢您的帮助 class db extends PDO { public function __construct() { echo "DB constructor called\n"; .. } class Admin extends db { private $uid,

我用了三节课。两个类扩展了第三个类db。但问题是,当我声明这些类的对象时,第二个对象被创建为第一个对象的克隆。提前感谢您的帮助

        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();
}


输出为

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
}

修改代码,请对此进行分析。当父项::u构造($dsn,DB_用户,DB_密码,$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);
?>


它们不是克隆。它们都是从db类继承的,您还没有对它们做任何更改。它们不是克隆—它们完全相同。

如果要防止2个PDO实例,请使用

我看不出有任何问题—输出完全符合预期。因此,在您包含的文件中的其他地方,它一定是一个错误。以下是独立测试代码:

<?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);
所以请检查您的实际代码。可能(只是可能)你把错误的文件包括进去了。。或者第二个类在另一个地方被声明(您可能编辑了错误的文件)

编辑:
亚历克斯,谢谢你提供更多信息。我在您更新的代码中发现了问题:
PDO::ATTR_PERSISTENT=>true
,--将
true
更改为
false
,并看到了区别:)

您能用较小的系统重新创建此问题吗。我很想做这件事,但最近我没有多少空闲时间。如果你能在一个较小的系统中观察到这个问题,那么它肯定是一个bug。由于完整的代码不在这里,我不能确定。@cem kalyoncu感谢您对我的问题表现出兴趣。我将在一个较小的系统中重新创建该情况,并在此处进行更新。请稍候。@Cem Kalyoncu我已将具有相同问题的较小代码放置在。请检查。使用依赖注入模式或服务定位器模式会更好。我已经在问题中添加了关于测试代码的修改代码。请检查。@Alex:在更新的代码中发现问题:
PDO::ATTR_PERSISTENT=>true,
--将其更改为
false
,并查看差异:)。另外--我相信您自己会找到关于此属性的文档。
<?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
}