2009-12-21 44 views
0

我想要做的就是訪問我的數據庫類中的查詢函數。 Evey時間查詢完成後,我會跟蹤所需時間並添加查詢計數,我希望爲所有查詢都做到這一點。從其他類訪問類中的函數

佈局我現在是:

   Global 
    ----------------------------- 
    |       | 
database class   application class 
           | 
          program class 

當數據庫類開始將它連接到數據庫,並做一些查詢的。下一次需要的是在課程中。

我需要保留querycount和totaltime變量並添加到它們。我也想要一個簡單的函數調用,我不想爲每個程序啓動這個類。它接近應該有一種方法來在應用程序級別調用它,並且能夠在程序級別使用查詢功能並在全局級別使用查詢功能。

我希望這是有道理的,我知道我想要什麼,但我已經把它變成文字的問題......

+0

也許編輯:'功能' - >'功能'?如果可以的話,我會這樣做,但我沒有足夠的代表來自己做... – 2009-12-21 09:46:56

+0

鑑於目前的答案涵蓋了一些話題,你可能想要添加一些更多的信息到你的問題,使它更清楚你想要達到的目標。 – Gordon 2009-12-21 10:37:59

回答

1

我不確定我是否正確理解了您的問題,但我建議您將靜態變量引入到您的數據庫類中,然後用它來存儲您希望該類「記住」的數據。就像這樣:

class Database 
{ 
public static $queryCount = 0; 
public static $queryDuration = 0; 

/* 
    ... the rest of your database stuff 
*/ 
} 

這兩個變量都可以通過數據庫:: $ queryCount和數據庫:: $ queryDuration訪問,將保持其值在類而不是實例化的對象。

內,您的查詢方法,您可以更新它們的值,如:

Database::$queryCount++; 

,並在你的腳本的末尾,你可以閱讀他們的內容。

+0

據我所知,儘管將它們聲明爲「public」是沒有意義的,因爲它們只應在類中調用類似query()的類時更新。 – Franz 2009-12-21 09:37:43

+0

對,更清晰的方法是將其聲明爲私有或受保護,並通過類內的適當方法訪問它們。但我只想用盡可能少的代碼在這裏展示我的觀點:) – selfawaresoup 2009-12-21 10:16:13

+0

是的,我可以看到這一點。然而,我的意思是,他們不應該被允許從課外開始。 – Franz 2009-12-21 10:25:36

0

看一看Zend_Db_Profiler,因爲它正是這樣做的。你可能會從那裏得到你自己的代碼的一些想法。

如果我必須自己做,我可能會爲數據庫類編寫一個Profiler Decorator,這個數據庫類會在每次運行查詢時爲我收集查詢統計信息。

另一種選擇是讓您的DB類和Profiler類使用Subject/Observer模式,其中每次運行查詢時DB類都會通知分析器。

或者您可以簡單地將Profiler實例注入到DB類中,並將DB類中的集合委託給分析器。

但是,我會不是解決集合,因爲這樣的DB類中的靜態屬性,因爲這個統計收集不是類的關注。

除此之外,我建議你延遲到數據庫的實際連接調用到需要時。第一次實例化DB類時不要連接,但要將該代碼放入連接方法中。然後當有人調用你的查詢方法時,檢查連接是否被調用,如果沒有,請運行connect()。如果沒有任何問題被詢問,則無需進行連接。

0

我想你可以看看工廠模式(使創建不同類型的數據庫更容易的子類,也

讓我提供低於它的修改版本。

class Database 
{ 
    protected static $instance = NULL; 

    public static function factory($type = '') 
    { 
     $type = strtolower($type); 

     if (self::$instance == NULL) 
     { 
      $className = 'Database_'.ucfirst($type); 

      // Include the class and do some checks here 

      self::$instance = new $className; 
     } 

     return self::$instance; 
    } 

你可以創建數據庫,無論你用這段代碼創建:

$db = Database::factory('mysql'); 

之後,你可以在全球範圍訪問數據庫對象是這樣的:

$db = Database::factory(); 

你的子類必須存儲在名爲像Database_MysqlDatabase_Postgresql類。