【问题标题】:How will a child class constructor interact with a parent class constructor in php?php中子类构造函数如何与父类构造函数交互?
【发布时间】:2012-09-17 04:29:29
【问题描述】:

现在,我正在开发两个用于与 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);
    }
}

当然还要定义这些变量。或者我可以在创建对象时添加这些值并将其隐式传递吗?

感谢任何帮助。

【问题讨论】:

    标签: php mysql class pdo


    【解决方案1】:

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

    以下就可以了:

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

    【讨论】:

    • 在这两种情况下,我还需要启动父类吗?否则,我可以只使用子类吗?顺便说一下,它还会做其他事情——只是为了添加更多细节。
    • @Mlagma 不需要启动父类,使用子类即可。
    • 我是这么认为的。这只是强化了我的信念,即 php.com 手册中的 cmets 不太值得信赖。
    • @Mlagma php.net 上的 cmets 是互联网上最好的错误信息来源之一。
    【解决方案2】:

    您在问题中提供的代码在这种情况下是正确的方法(假设您想在构造函数中执行其他操作):

    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
    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-02-28
      • 2014-12-16
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多