我曾经读过静态类非常困难,甚至无法调试。这是真的吗?为什么?

时间:2010-08-06 13:43:40

标签: language-agnostic static static-classes

我曾经读过静态类非常困难甚至无法调试。这是真的吗?为什么?

如果一个例子有帮助,这里是我用来访问数据库的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();
    }
}

?>

2 个答案:

答案 0 :(得分:4)

只要你的静态类有方法而没有数据,它就只是一个命名空间。没问题。但是如果您有静态数据,则会遇到与全局变量相同的问题:您无法再通过查看本地信息来了解系统的行为。特别是在多线程环境中,您可能会遇到意外行为和调试困难。

答案 1 :(得分:1)

我认为您所阅读的内容与测试这些类有关。

如果对此有更好的深入解释,我建议您阅读Misco's博客。我发现它们是有价值的信息来源。

  

静态方法的基本问题是   它们是程序代码。我没有   想法如何对程序代码进行单元测试。   单元测试假设我可以   实例化我的一个应用程序   处于隔离状态。在实例化期间   我用依赖关系连接   嘲笑/友谊取代了   真正的依赖。随着程序   编程没有“连线”   因为没有对象,代码   和数据是分开的。