现在,我正在开发两个与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()
{
parent::__construct();
}
}
我刚刚开始写它们,所以它们还没有“肉”。如果有人发现任何重大问题或任何建议,请随时指出。
我的问题是,子构造函数将如何与父代进行交互。我的计划是简单地创建一个CheckOut对象而不启动父项。可以看出,我的父构造函数有四个值。那么,我是否必须在子构造函数中重新定义这些值?要清楚,我的意思是:
class CheckOut extends DB_MySQL{
function __construct($dbuser, $dbpass, $dbhost, $dbname)
{
parent::__construct($dbuser, $dbpass, $dbhost, $dbname);
}
}
当然要定义那些变量。或者,我可以在创建对象时添加这些值,并且会隐式传递它吗?
感谢任何帮助。
答案 0 :(得分:3)
如果子类的构造函数没有做任何其他事情,那么你可以省略构造函数。
如下所示:
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);
答案 1 :(得分:1)
您在问题中提供的代码是在这种情况下执行此操作的正确方法(假设您要在构造函数中执行其他操作):
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
}