2012-03-02 53 views
0

我開始使用PHP類並查看OOP。正確地與PHP類/函數進行交互? (OOP)

我通過創建一個數據庫類,它看起來是這樣的(片段)發揮各地:

class Database 
{ 

private $link; 
private $result; 
private $count; 

    function connect() 
    { 
     $this->link = mysql_connect(DB_HOST, DB_USER, DB_PW); 
     $return = $this->link ? 'Connected to database.' : 'Failed to connect.'; 
     $this->open(); // I have another function in this class to select the db 
     echo $return; 
    } 

    function query($query) 
    { 
     $this->result = mysql_query($query); 

    } 

    function fetch() 
    { 
     return mysql_fetch_assoc($this->result); 

    } 

    function count() 
    { 
     $this->count = mysql_num_rows($this->result); 
     return $this->count; 
    } 
} 

只是爲了測試,我創建了另一個類叫做留言,看起來像這樣:

class Guestbook 
{ 

    function fetch() 
    { 
     Database::query('SELECT * FROM guestbook LIMIT 2'); 
     while($row = Database::fetch()){ 
     $result_array[] = $row; 

     return $result_array; 
    } 

} 

現在我測試了這個功能:

$db = new Database(); 
$db->connect(); 
$db->query('SELECT * FROM test'); 
while($row = $db->fetch()) { 
    echo $row['id'].'<br />'; 
} 
echo $db->count(); 
$db->close(); 

這個按預期工作。因此,我還是繼續進行留言類:

$db->connect(); 
$guestbook = new Guestbook(); 
$results = $guestbook->fetch(); 

foreach($results as $gb) { 
    echo $gb['id']; 
} 

echo $db->count(); // HERE'S MY PROBLEM ! 

$db->close(); 

一切正常,我想,但我第二次打電話$db->count()回聲前一計,而不是2(爲我設定的限制2在留言取功能)。

我如何使用這些類正確的交互,這樣我就可以使用類似$db->count()全球?

在此先感謝您提供任何提示或解決方案!

+0

你爲什麼要靜態地從調用數據庫的模式你留言分類?如果你想靜態使用它,你應該聲明它,並且只能像這樣使用它:) 我建議製作數據庫單例。 – 2012-03-02 14:17:01

+1

問題在於這裏混合了靜態和對象調用。將它規範化,以便在任何地方使用靜態或對象。建議看看Singleton模式。 – 2012-03-02 14:25:32

+1

另一件事是,你通常會保留在留言簿類中的所有內容。您可以調用$ guestbook-> getPosts(),它通過一個私有或受保護的getDataRow()方法獲取所需的數據,該方法將數據設置爲留言簿中的受保護變量,以便您可以多次訪問它而不必每次都訪問數據庫。 – 2012-03-02 14:29:00

回答

2

這是很難給你你怎麼可以換用OOP數據庫訪問一個明確的意見,仍然()全球訪問計數。

顯然你的代碼是錯誤的。

使用符號

Database::query 

你指的是某種對數據庫類,它似乎並沒有在這裏是意圖靜態方法。它看起來像你的代碼不會因爲與PHP4的向後兼容性而崩潰。

,你可以沿着這條道路重寫留言:

class Guestbook 
{ 

    private $db; 

    function __construct(&$db) { 
     $this->db = $db; 
    } 

    function fetch($option) 
    { 
     $this->db->query('SELECT * FROM guestbook LIMIT 2'); 
     while($row = $this->db->fetch()){ 
     $result_array[] = $row; 

     return $result_array; 
    } 

} 

然後

$db = new Database(); 
$db->connect(); 
$guestbook = new Guestbook($db); 
$results = $guestbook->fetch(); 
echo $db->count(); 

這種技術使用一種被稱爲「依賴注入」

+0

感謝您向我展示我如何做到這樣的事情! – Fabian 2012-03-02 14:39:35

1

當您從guestbook-> fetch()方法獲得結果時,爲什麼要使用db類中的count?

這究竟同樣的伎倆:

echo count($resutls); 
+0

我已經這樣做了,但我想使用mysql_count。 – Fabian 2012-03-02 14:18:37

+0

在這種情況下,沒有理由這樣做,恕我直言。但是,如果你真的想要它,你可以從留言簿中返回整個數據庫對象。這不是你通常會做的,因爲你只是爲已經存在的東西創建不必要的代碼。 – 2012-03-02 14:21:22

4

首先,沒有任何理由來包裝mysql_*實現OOP中。如果你打算做OOP,那麼只需使用你可以擴展的OOP類的MysqliPDO

其次,您想要在GuestBook類中保存數據庫的實例,而不是將其作爲Database類本身的擴展。

+0

我只是在玩這個話題。我想理解它,所以我自己創造了一些東西。這不會用於任何實際的項目。 – Fabian 2012-03-02 14:20:38

+0

我明白,我只是說你用一條可憐的路去嘗試並獲得理解:-) – prodigitalson 2012-03-02 14:25:41

+0

@Fabian真實的項目與否,prodigalson給了你如何改善 – 2012-03-02 14:27:05

0

看到$db是類數據庫的對象 從未訪問的留言

功能或屬性,您可以直接與count($resutls)

得到這樣或可能要與繼承的概念

謝謝

0

你混合靜態和你的類的實例化版本。如果你想能夠創建一個類的多個實例,你應該有一個__construct函數。儘管這不是必需的,但最好有一個。

您正在創建一個新實例並將其分配給$ db變量($ db = new Database();)。但是,在您的GuestBook類中,您正在靜態引用數據庫類(Database::)。該語法引用了所有實例中相同的「基本」類。你想要做的是引用你創建的數據庫類的實例。通常,您會將數據庫實例傳遞給構造函數中的GuestBook類,並將其存儲在類變量中,然後使用$ this引用它。

class Guestbook 
private $db = null; 
{ 
    function __construct($db) { 
     $this->db = $db; 
    } 

    function fetch($option) { 
     $this->db->query('SELECT ...'); 
     ... 
    } 
} 

$db = new Database(); 
$guestbook = new Guestbook($db); 
相關問題