2013-02-02 28 views
0

我需要一些關於php對象繼承情況的指導。 我: 配置對象,如:來自類構造函數的PHP對象繼承 - 正確的方法

configuration{ 
    var driver = 'mysql'; // or 'mssql'; 
    var host = 'database_host'; 
    var user = 'database_user'; 
    var password = 'database_password'; 
    var name = 'database_name'; 
} 

兩臺數據庫處理類:

class mysql{ 
    public mysql(){} // connect 
    public query(){} // set a query 
    public result(){} // load result 
} 

class mssql{ 
    public mysql(){} // connect 
    public query(){} // set a query 
    public result(){} // load result 
} 

和某種類控制器:

class database{ 
    public function __construct(){ 
     $configuration = new configuration; 
     /* 
     * now, depending on the value of the $configuration->driver 
     * my database class must inherit methods from mysql or mssql class 
     */ 
     switch($configuration->driver){ 
      case 'mysql': 
       // database inherit mysql methods 
      break; 
      case 'mssql': 
      // database inherit mssql methods 
      break; 
     } 
    } 
} 

用法,如:

$database = new database; 
$database->query('select * from some_table'); 
$result = $database->result(); 

所以,當我用我數據庫類的方法,這取決於配置對象,實際上我用的mysql MSSQL 方法。 我看到它的方式不通過,因爲我想我的數據庫類繼承類構造函數中的另一個類。

我希望有人能給我一個關於如何做到這一點的建議..讓我們說...正確的方法。

謝謝。

+0

我在這裏沒有看到任何繼承 - 是數據庫應該擴展嗎? – halfer

+0

你似乎在談論'工廠'模式。看它,它可能有助於回答你的問題 – thaJeztah

+0

爲halfer問題,我想某種dinamically擴展;事情是,我不知道什麼是父類,直到數據庫構造器中的「切換」。 – stef

回答

0

如果有人,因爲confusend作爲我來說,閱讀這篇文章,這是我找到的解決方法(研究周後 - 是的,周後):使用Singleton模式

,創建一個父類被稱爲數據庫:

class database{ 
    protected static $instances = array(); 

    // method to create a new instance of this object 
    public function getInstance($driver){ 
     $instanceid = md5($driver); 

     if(self::$instances[ $instanceid ] == null){ 
      self::$instances[ $instanceid ] = new $driver; 
     } 

     return self::$instances[ $instanceid ]; 
    } 

    public function testFunction(){ 
     //do something else 
    } 
} 

然後創建驅動程序的功能

class mysql extends database{ 
    public mysql(){} // connect 
    public query(){} // set a query 
    public result(){} // load result 
} 

class mssql extends database{ 
    public mysql(){} // connect 
    public query(){} // set a query 
    public result(){} // load result 
} 

現在使用它像

$database = database::getInstance('mysql'); 
$database->query(); // works 
$database->testFunction(); // works to 

,並進一步上,你可以使用和喜歡

$database = database::getInstance('mssql'); 
$database->query(); // works 
$database->testFunction(); // works to 

我需要道歉Froncoise爲取消選中他的回答是正確的。

1

nonono,這是不是oop-thinking。你應該谷歌爲以下關鍵字:

當你這樣做時,把switch語句放入工廠,使mysql類成爲一個名爲DBDriver的接口,並在數據庫類中使用策略模式。

+0

謝謝,我會做一些研究。 事情是這樣的,在發佈這個問題之前,我已經閱讀了關於'界面'的內容,但我並沒有完全使用它。 經過研究,我會回來的:-) – stef