2011-08-02 51 views
0

我有一個主類和一個擴展類(數據庫連接)。調用擴展類方法問題

父類名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 
     } 
+1

'$ this-> connectdb();'應該在父類的函數中工作,如果對象是'DatabaseQ'對象,如果擴展了非靜態方法。在這個函數中,你認爲它不稱之爲擴展類? – Wrikken

+0

你真的實例化擴展/子類,並且你正在調用子類的那個實例的函數嗎? – Endophage

+0

@Endophage好的。我怎樣才能instanciate在父親構造擴展類,所以它的方法可以使用? – Codex73

回答

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「驅動程序」(擴展類有重載方法),你可以創建一個抽象類,將只包含一個基類你的擴展(驅動程序)類需要實現的所有方法的藍圖。

但是,這是一個有點先進的故事:)

編輯:如果您需要這將專門用於輸出的東西哪個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,這意味着它們的角色主要是充當數據庫和所有數據獲取/發送操作的抽象層。

如果我是你,我會創建一個類,專門負責輸出用數據庫類檢索的數據。這樣,您將創建一個以某種方式充當視圖的類,並將接受輸出數據的所有責任。

+1

看看我的編輯。它有點長,但我相信它爲您提供了足夠的信息,可能會重新考慮您的班級職責和組織。 – brezanac

+0

哇。這很棒!非常感謝@holodoc這樣一個很好的解釋。 – Codex73

1

使用抽象方法。並閱讀關於面向對象的書。

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!' 
+0

只有我能想到的方式。 – Bretticus

+1

喜歡「在OOP上讀書」!我想我會採取建設性的。 – Codex73