Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中,子类构造函数如何与父类构造函数交互?_Php_Mysql_Class_Pdo - Fatal编程技术网

在php中,子类构造函数如何与父类构造函数交互?

在php中,子类构造函数如何与父类构造函数交互?,php,mysql,class,pdo,Php,Mysql,Class,Pdo,现在,我正在开发两个与MySQL数据库交互的类——一个扩展另一个。这是: class DB_MySQL { protected $dbuser; protected $dbpass; protected $dbhost; protected $dbname; protected $dbh; // Database connection handle public function __construct($dbuser, $dbpass, $d

现在,我正在开发两个与MySQL数据库交互的类——一个扩展另一个。这是:

class DB_MySQL {

    protected $dbuser;
    protected $dbpass;
    protected $dbhost;
    protected $dbname;
    protected $dbh; // Database connection handle

    public function __construct($dbuser, $dbpass, $dbhost, $dbname)
    {
        $this->dbuser = $dbuser;
        $this->dbpass = $$dbpass;
        $this->dbhost = $dbhost;
        $this->dbname = $dbname;
    }

    //Used to create connections - almost always called by execute()
    protected function connect()
    {
        try
        {
            $this->dbh = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
        }
        catch(PDOException $e)
        {
            print "Error!: ".$e->getMessage()."<br/>";
            die();
        }
    }
我刚开始写,所以还没有肉给他们吃。如果有人看到任何重大问题或任何建议,请毫不犹豫地指出

不过,我的问题是,子构造函数将如何与父构造函数交互。我的计划是只创建一个签出对象,而不启动父对象。可以看到,我的父构造函数接受四个值。那么,我必须在子构造函数中重新定义这些值吗?说清楚,我的意思是:

class CheckOut extends DB_MySQL{

     function __construct($dbuser, $dbpass, $dbhost, $dbname) 
    {
        parent::__construct($dbuser, $dbpass, $dbhost, $dbname);
    }
}
当然,还要定义这些变量。或者,我可以在创建对象时添加这些值,然后隐式传递它吗


非常感谢您的帮助。

如果子类的构造函数不做任何其他事情,那么您可以省略构造函数

class CheckOut extends DB_MySQL{

    // no constructor, Parent's constructor is called by default

}
只需以下内容即可:

class CheckOut extends DB_MySQL{
}
但是如果子类的构造函数需要做一些其他工作,那么您需要做:

class CheckOut extends DB_MySQL{

    public function __construct($dbuser, $dbpass, $dbhost, $dbname) 
    {
        parent::__construct($dbuser, $dbpass, $dbhost, $dbname);
        do_some_other_work();
    }
}
使用时,双方都需要呼叫:

$checkout = new CheckOut($dbuser, $dbpass, $dbhost, $dbname);

如果子类的构造函数不做任何其他事情,那么可以省略构造函数

class CheckOut extends DB_MySQL{

    // no constructor, Parent's constructor is called by default

}
只需以下内容即可:

class CheckOut extends DB_MySQL{
}
但是如果子类的构造函数需要做一些其他工作,那么您需要做:

class CheckOut extends DB_MySQL{

    public function __construct($dbuser, $dbpass, $dbhost, $dbname) 
    {
        parent::__construct($dbuser, $dbpass, $dbhost, $dbname);
        do_some_other_work();
    }
}
使用时,双方都需要呼叫:

$checkout = new CheckOut($dbuser, $dbpass, $dbhost, $dbname);

在本例中,假设您希望在构造函数中执行其他操作,您在问题中提供的代码是正确的执行方法:

class CheckOut extends DB_MySQL{
    function __construct($dbuser, $dbpass, $dbhost, $dbname) 
    {
        parent::__construct($dbuser, $dbpass, $dbhost, $dbname);
    }
}
否则,如果不想在构造函数中执行任何其他操作,则不需要重写构造函数

class CheckOut extends DB_MySQL{

    // no constructor, Parent's constructor is called by default

}

在本例中,假设您希望在构造函数中执行其他操作,您在问题中提供的代码是正确的执行方法:

class CheckOut extends DB_MySQL{
    function __construct($dbuser, $dbpass, $dbhost, $dbname) 
    {
        parent::__construct($dbuser, $dbpass, $dbhost, $dbname);
    }
}
否则,如果不想在构造函数中执行任何其他操作,则不需要重写构造函数

class CheckOut extends DB_MySQL{

    // no constructor, Parent's constructor is called by default

}

但是,在这两种情况下,我还必须启动父类吗?否则,我可以使用child类吗?顺便说一句,它还可以做其他事情——只是添加一些细节。@Mlagma您不需要启动父类,只需要使用子类。我想是这样的。这只是加强了我的信念,即php.com手册上的注释不太可信。@Mlagma php.net上的注释是互联网上最好的错误信息来源之一。不过,在这两种情况下,我还需要启动父类吗?否则,我可以使用child类吗?顺便说一句,它还可以做其他事情——只是添加一些细节。@Mlagma您不需要启动父类,只需要使用子类。我想是这样的。这只是加强了我的信念,即php.com手册上的评论不太可信。@Mlagma php.net上的评论是互联网上最好的错误信息来源之一。