2010-08-06 45 views
5

我曾經讀過靜態類非常困難,甚至無法調試。這是真的嗎?爲什麼?我曾經讀過靜態類非常困難,甚至無法調試。這是真的嗎?爲什麼?

如果一個例子會有所幫助,這裏是一個PHP類我用來訪問數據庫(我不認爲這是一個PHP特定的問題,雖然):

<?php 

class DB 
{ 
    private static $instance; 

    private function __construct() { } 

    public static function getInstance() 
    { 
     if(!self::$instance) 
     { 
      self::$instance = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';', DB_USER, DB_PASS); 
     } 
     return self::$instance; 
    } 

    public static function getPreparedStatement($query) 
    { 
     $db = self::getInstance(); 
     return $db->prepare($query); 
    } 

    public static function query($query) 
    { 
     $stmt = self::getPreparedStatement($query); 
     $stmt->execute(); 
    } 

    public static function getResult($query) 
    { 
     $stmt = self::getPreparedStatement($query); 
     $stmt->execute(); 
     return $stmt; 
    } 

    public static function getSingleRow($query) 
    { 
     $stmt = self::getPreparedStatement($query); 
     $stmt->execute(); 
     return $stmt->fetch(); 
    } 

    public static function getMultipleRows($query) 
    { 
     $stmt = self::getPreparedStatement($query); 
     $stmt->execute(); 
     return $stmt->fetchAll(); 
    } 
} 

?> 
+0

希望你已經準備好參加一場戰爭......對於靜態類/方法有很多仇恨,當你提出單例時它會變得更糟...... – Nix 2010-08-06 13:50:47

+0

沒關係:-)我很好奇這個主題並期待人們提供的答案。 – 2010-08-06 13:51:46

回答

4

只要你的靜態類有方法但沒有數據,它只是一個命名空間。那裏沒問題。但是,如果您有靜態的數據,則會遇到與全局變量相同的問題:您無法再通過查看本地信息來了解系統的行爲。特別是在多線程環境中,您可能會遇到意外的行爲和難以調試的情況。

+0

這很有道理! – 2010-08-06 14:12:24

1

我會認爲什麼你讀的是與測試這些類有關。

對於這個和更多的好的深入解釋,我建議你閱讀Misco's博客。我發現他們是一個寶貴的信息來源。

靜態方法的基本問題是 他們是程序代碼。我沒有 想法如何對程序代碼進行單元測試。 單元測試假設我可以 孤立地實例化我的一個應用程序 。在實例化 期間,我將依賴關係與 mocks/friendlies進行連線,以取代 真正的依賴關係。由於沒有對象,代碼 和數據是分開的,所以程序 編程時沒有什麼可以「連線」 。

+0

我認爲它是一個涉及嘲弄靜態類或模擬具有靜態方法的類的兩部分問題。主要是因爲你不能連接它們。 – Nix 2010-08-06 13:49:27

相關問題