2010-08-06 54 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

相关问题