2010-05-13 89 views
1

抽象類數據庫是數據庫交互和這個類的任何孩子發(UserDatabase,ActionDatabase,EventDatabase)繼承其定義爲靜態數據庫連接繼承數據庫連接

abstract class Database { 
    public static $connection; 
    public function __construct() {  
     ... 
     $this->connection = mysql_connect($host, $username, $password);  
    } 
}  
class UserDatabase extends Database { 
    public function verify() { 
     if ($this->connection == parent::$connection) { 
      print "true"; 
     } else { 
      print "false"; 
      print "this:" . $this->connection . " parent:" . parent::$connection; 
     } 
    }  
} 
$instance = new UserDatabase(); 
$instance->verify(); 
// this prints false, as parent::$connection is empty 

意思,我的數據庫連接僅設置和存儲在內存中一次並傳遞到子類中作爲參考而不被複製爲每個實例?

這是你如何實現你的OOP正確的數據庫接口?

回答

2

暫時忽略你的代碼,只看你對這個方案應該如何工作的描述......是的,數據庫連接只會爲每個PHP腳本設置一次,並且不會爲每個實例重複。

這是否是一個好主意取決於你的子類是什麼。每個班級都應該有一個責任。只要子類唯一的責任是數據庫交互,你可能沒問題。 (請參閱存儲庫模式,瞭解如何實現這一點。)如果您的User類擴展了數據庫以便它可以存儲自己,那麼您已經越過了一條線,正在編寫將具有太多依賴性和責任的類。

至於你的代碼...幾乎你的代碼的每一行都是錯誤的。您無法將類變量初始化爲函數的結果。你的SQL錯了。行$connection ? "connected" : "not connected";什麼都不做。幾乎沒有一個應該在構造函數中完成。等等

+0

你是絕對正確的,我是想說明類儘可能短的目的,但我想我的PHP語法讓我失望。 My ** User **實例是** UserDatabase **返回的內容。用戶類只是系統在處理腳本時可能需要的值的setter/getter類。 當腳本完成時,它將User對象傳遞給當前的UserDatabase,因此它可以剝離User到值,然後將更新查詢發送到數據庫服務器。 因此,類的數據庫繼承鏈與它返回的類型是分開的。 ActionDatabase返回並接受Action的一個實例。 – sdkfasldf 2010-05-13 18:47:27

1

如果你對這些類別做數據庫交互但沒有做別的事情,那麼這種模式是可以的。

否則,如果您每次都可以使用「getInstance()」創建一次數據庫類,那麼您可能會更好。單身設計模式。

http://www.tonymarston.net/php-mysql/singleton.html

+0

這是一篇非常好的文章,謝謝。 – sdkfasldf 2010-05-13 18:48:55