6

我一直在编写一个恰好 450 行长的 PHP 类,它包含 14 个静态方法和 4 个静态属性以及 6 个常量(以及私有__construct()__clone())。

我想知道这是我做错了什么,我的班级是邪恶的吗?

当你使用这个类时,你总是调用一个方法,比如:

MyClass::coolMethod();

然后你完全不理会它,所以觉得让它可构造是愚蠢的?

用它来构造对象真的没有多大意义,因为它更像是一个包含一些你可以直接调用的方法的工具。

实际上,在这 14 个方法中,有 7 个是公共的——其余的都是私有的,供类使用。

4

5 回答 5

4

你应该尽量static避免global

静力学给你的缺点和全局变量给你的一样。每当您使用任何类方法时,您都在将对该类的依赖项硬编码到使用代码中。结果是可维护性较差的紧耦合代码。这可以通过完全避免静态和严格使用依赖注入来轻松避免。

您不能注入和传递静态类,因此例如当您必须对它们进行单元测试时,您不能模拟它们或者至少只能通过一些努力)。这简直是​​痛苦的。静态方法是可测试性的死亡。

另外,请记住,类应该只做一件事。他们应该有一个单一的责任。浏览你的班级,看看那里是否有更好的东西放在其他地方以避免编写上帝班。

于 2010-12-06T15:13:27.550 回答
3

这取决于这个类的目的。如果这些方法在数据方面大多是不连贯的,那么这是分组函数(现在的方法)的一个完全有效的解决方案。如果您需要在函数之间共享值,那么这是一个非常糟糕的主意,因为这不仅仅是一个简单的函数列表,而是以一个通用名称分组。命名空间是另一种选择,但如果您使用低于 5.3 的 PHP 版本,这可能是最好的解决方案。

于 2010-12-06T15:06:30.720 回答
2

这就像在说,“我有一个有四间卧室的房子。这很糟糕吗?”

静态方法既不好也不坏。有十四种方法,既不好也不坏。通过扩展,拥有 14 个静态方法既不好也不坏。

如果在您的十四种方法中,您将竭尽全力模拟对象实例或模拟继承,那么就出现了可怕的错误。PHP 将允许您创建实例,并支持继承,因此尝试以任何其他方式模拟它们是愚蠢的。

但是,如果您只是像使用命名空间一样使用您的类,其中函数和数据一起工作,但没有要处理的类的单个实例,那绝对没有错。

于 2010-12-06T15:07:26.400 回答
1

不错。但是,对于所有这些静态道具,您可能需要考虑将其设为单例。

这是我正在构建的框架中使用的一些单例代码。您可以将其拆开,使其成为您的类的唯一公共方法,该方法返回其自身的一个版本。

class ClassName {
    function getInstance()
        {
            static $instance;

            if (!isset($instance)) 
      {
                $instance = new ClassName();
            }

            return $instance;
        }
}

然后,您将通过执行 ClassName::GetInstance()->othermethod(); 来使用它。

然后,该类可以拥有大量私有值,并获得对象所拥有的所有好处。

于 2010-12-06T15:14:19.683 回答
0

我会说不,这还不错。事实上,这是以前伪造某些行为的唯一方法。例如,这是一种伪造命名空间的方法。可以将函数封装在静态类中,而不是让它们“免费”。所以很多 php 开发人员都熟悉这一点,它实际上不会让大多数人感到困惑。但是,您现在应该尝试做的是利用 PHP 的“新”命名空间功能,如果您确实需要以对象格式存储数据,如果需要的话,可以将其与单例模式结合起来。您也可以在命名空间中包含一个“全局”变量,并且有时可以正常工作。但是看看命名空间,看看它是否适合你,然后看看单例模式是否符合你的特定需求。

于 2010-12-06T15:35:22.857 回答