2012-09-17 34 views
2

现在,我正在开发两个与MySQL数据库进行交互的类 - 一个扩展了另一个。在这里,他们是:子类的构造函数如何与PHP中的父类构造函数进行交互?

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

并且当然定义了这些变量。或者我可以添加这些值,当我创建对象,它会隐式地传递?

任何帮助表示赞赏。

回答

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); 
+0

在这两种情况下,我是否仍然需要启动父类?否则,我可以只使用儿童班吗?顺便说一下,它会做其他的事情 - 只是为了增加一些细节。 – Mlagma

+0

@Mlagma你不需要启动父类,只需使用子类。 – xdazz

+2

我觉得如此。这只是强化了我的信念,即在php.com手册中的评论不是很值得信赖。 – Mlagma

1

您在问题中提出的代码是在此情况下执行此操作的正确方法(假设t您想要做在构造别的东西):

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 

}