调用扩展类方法问题

时间:2011-08-02 21:53:57

标签: php mysql oop

我有一个主类和一个扩展类(数据库连接)。

父类名Classica
扩展DatabaseQ

如何在父级中调用扩展类方法?

这不起作用:

$this->connectdb();

或者这个:

$this->DatabaseQ->connectdb();

示例代码:

扩展

class DatabaseQ extends Classica{

    public $dbhost;
    public $dbname;
    public $dbuser;
    public $dbpass;

    function __construct(){
        include('config.php');
        $this->dbhost = $dbhost;
        $this->dbname = $dbname;
        $this->dbuser = $dbuser;
        $this->dbpass = $dbpass;
    }

    #connect to database
    public function connectdb(){      
        $link = mysql_connect($this->dbhost,$this->dbuser,$this->dbpass);
        if (!$link) {
          die('Could not connect: ' . mysql_error());
        }else {
            //echo 'Connected Successfully to Database<br>';
        }
        @mysql_select_db($this->dbname) or die( "Unable to select database!");
    } 

    #read database
    function readdb(){        
    }    
    #update database
    private function updatedb(){        
    }
    #close database connection
    function closedb(){
        mysql_close();    
    }

}

class Classica{  

        function sample_method(){
            //connect db here
            //run some sql queries here
        }

2 个答案:

答案 0 :(得分:1)

使用抽象方法。并阅读有关OOP的书。

abstract class Classica {
  public abstract function connectdb();
  public function Test() {
    $this->connectdb();   
  }
}

class DatabaseQ extends Classica {
  public function connectdb(){
    echo 'connected!';
  }
}

$x = new DatabaseQ();
$x->Test();   // output: 'connected!'

答案 1 :(得分:1)

根据你们两个课程的内容来判断你完全没有理由使用Classica课程,因为当你把它全部包裹起来时,你会不必要地将功能责任分散到几个课程上在单个班级里面。

我看到你使用“父”类的唯一原因是连接到你的数据库并做一些初始查询。除非您计划稍后实现某些高级设计模式,否则您无法在DatabaseQ构造函数中执行此操作。

class DatabaseQ {
    public $dbhost;
    public $dbname;
    public $dbuser;
    public $dbpass;

    function __construct(){
        include('config.php');
        $this->dbhost = $dbhost;
        $this->dbname = $dbname;
        $this->dbuser = $dbuser;
        $this->dbpass = $dbpass;

        $this->connectdb(); // This is a good place to initiate your DB connection
        $this->doOtherInitStuff(); // Calling the rest of the init stuff.
    }

    /**
     * This is the place where you do all of your init stuff. 
     * Note the private status! The environment doesn't need to have access to your DB initialization stuff
     */
    private function doOtherInitStuff() {
        // Do init stuff
    }

    #connect to database
    private function connectdb(){ // Note the private scope too! Only the object itself needs to know how to connect to the db!
        $link = mysql_connect($this->dbhost,$this->dbuser,$this->dbpass);
        if (!$link) {
          die('Could not connect: ' . mysql_error());
        }else {
            //echo 'Connected Successfully to Database<br>';
        }
        @mysql_select_db($this->dbname) or die( "Unable to select database!");
    } 

    #read database
    function readdb(){        
    }    
    #update database
    private function updatedb(){        
    }
    #close database connection
    function closedb(){
        mysql_close();    
    }

}

另一方面,如果您打算创建一个基类,稍后将使用它来说不同的DB“drivers”(带有重载方法的扩展类),您可以创建一个抽象类,它只包含所有的蓝图。扩展(驱动程序)类需要实现的方法。

但那是一个有点高级的故事:)

编辑:如果您需要一个专门用于输出DatabaseQ检索的东西的类,那么创建一个扩展的DatabaseQ类,并将所有将吐出数据的内容放在其中。

class DatabaseQOutput extends DatabaseQ {
    public function __construct(){
        parent::__construct(); // You make sure here that the parents constructor is executed and a DB connection and initialization stuff is taken care off 
    }

    public function output() {

    }
}

$db = new DatabaseQOutput();
$db->output();

但是说实话,你实际上并不希望任何特定于数据库的类负责输出数据,因为这通常不是他们的工作。数据库类应该被视为模型,尽管您没有使用MVC,这意味着它们的角色主要是作为数据库和所有数据获取/发送操作的抽象层。

如果我是你,我会创建一个专门负责输出数据的类,这些数据是用数据库类检索的。这样你就可以创建一个以某种方式充当视图的类,并接受输出数据的所有责任。