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();
    }
}

?>
4

2 回答 2

4

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

于 2010-08-06T13:49:49.487 回答
1

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

要对此以及更多内容进行深入的解释,我建议您阅读Misco 的博客。我发现它们是宝贵的信息来源。

静态方法的基本问题是它们是过程代码。我不知道如何对程序代码进行单元测试。单元测试假设我可以单独实例化我的应用程序的一部分。在实例化期间,我将依赖项与替换真正依赖项的模拟/友好连接。对于过程式编程,没有什么可以“连接”的,因为没有对象,代码和数据是分开的。

于 2010-08-06T13:46:15.307 回答