2011-08-10 56 views
1

我有一個持有mysqli實例的類(這樣可以避免遍佈源代碼的數據庫設置)。如何用可變數量的參數重載方法?

類DB的樣子:

class DB { 
    private $mysqli; 

    public function connect() { 
     $this->mysqli = new mysqli("localhost", "user", "pwd", "db-name"); 
    } 

    public function __call($method, $args) { 
     return $this->mysqli->$method(extract($args)); 
    } 
} 

正如你可能會看到什麼,我試圖做的是重載每一個方法調用執行的mysqli的。

在其他PHP文件,我有:

$unq_vstr = $this->db->query("SELECT * FROM user_log WHERE user_ip='$ip' AND user_last_visit='$now';"); 
if ($unq_vstr->num_rows > 0) { // ERROR 
    // ... 
} 

但我發現了「注意:試圖讓非對象的財產上線/home/alessandro/www/admin/index.php 25「對應於if語句($ unq_vstr-> num_rows)。

我在做什麼錯? 我很確定它可能取決於數據庫類,但我無法弄清楚是什麼問題。

你覺得我應該用另一種方式來做到這一點嗎(沒有在我自己的類中包裝mysqli)? 任何建議表示讚賞。

回答

3

您正在尋找

例子:

public function __call($method, $args) { 
    return call_user_func_array(
     array($this->mysqli, $method), 
     $args 
    ); 
} 

參見Pseudo-types and variables的章節可能回調語法

在一個旁註,包裝和mysqli實例int一個Decorator,不裝飾任何方法調用是毫無意義的。所以,是的,我認爲你不應該把mysqli對象包裝到裝飾器中。相反,在bootstrap中創建一次mysqli實例,然後將其傳遞給任何需要它的組件,從裏到外堆疊對象。

另見

+0

哇,好一個完整的答案。非常感謝!這真的很有幫助。 –