我应该使用静态类,什么是优势(或劣势)?

时间:2013-07-30 14:20:40

标签: php

我经常看到这些课程,但我不会在我的项目中使用它们。我正在检查来自here的这些设计模式,我注意到它们使用静态类

从上面的页面中,示例代码:

class AutomobileFactory
{
    public static function create($make, $model)
    {
        return new Automobile($make, $model);
    }
}

或以单身模式:

  public static function getInstance()
    {
        static $instance = null;
        if (null === $instance) {
            $instance = new static();
        }

        return $instance;
    }

3 个答案:

答案 0 :(得分:1)

第一个例子是工厂类。工厂是一段代码,可帮助您创建和配置对象。工厂可以是函数或方法,静态类或实例化类。通常没有必要实例化工厂,因此通常使用静态类。但我认为工厂也可以实例化。这样做可以让您配置或扩展工厂,因此它比单一的静态工厂方法更灵活。

另外,我认为在大多数情况下,静态类只是一个借口。人们往往倾向于将全局函数或变量提升为静态类来制作“干净”的代码,但它几乎没有改进。在PHP支持的命名空间之前它有点用处,但是现在,我认为在创建静态类时应该小心。

这同样适用于单身人士,虽然它有其用途,因为在某些情况下你只想拥有一个班级的一个实例。此示例包括连接池或硬件控制器。拥有某个对象的多个实例可能会导致问题,因此这是使用单例的一个很好的理由。 但是人们经常在没有需要时将对象变成单身。在这种情况下,我认为这只是一种隐藏你使用全局变量的事实的方法,这是不好的做法。

但单身人士不是静态阶级。它只是一个隐藏其构造函数的类,并提供了一个静态方法来访问类的单个实例。它与静态类相似,但不一样。

我可以推荐阅读Head First Design Patterns。它以有趣和易懂的方式解释了这两种模式(以及更多)。代码示例倾向于Java,但这几乎不是问题。

答案 1 :(得分:1)

我建议您首先阅读How Not To Kill Your Testability Using Statics作为我将在下面讨论的内容的介绍。

工厂的重点通常是允许依赖注入需要实例化其他对象的方法/对象。 E.g:

public function foo() {
    $bar = new Bar;
}

这很糟糕,如上文所述。但是这个方法必须能够实例化Bar对象本身。然而,我们仍然希望依赖注入 进入工厂:

public function foo(BarFactory $factory) {
    $bar = $factory->create();
}

因此,static工厂毫无意义:

public function foo() {
    $bar = BarFactory::create();
}

这里直接实例化new Bar几乎没有优势。

单身人士是一个热门讨论的话题,他们经常被劝阻,因为不鼓励全球性的对象。静态被提到的单身人士又是坏人,正如文章中详细讨论的那样。

答案 2 :(得分:0)

These classes have a definite use.  Let's take an example of a logger.

class Logger() {
    private __construct() {}

  public static function getInstance()
    {
        static $instance = null;
        if (null === $instance) {
            $instance = new static();
        }

        return $instance;
    }

//other methods here

}`

}

现在,在实例化之后,您可以执行类似

的操作

记录器::日志(参数)

其中log是该类中的方法。

这只是这样一个类非常有用的一个例子。