为什么人们在他们的PHP框架中使用单例

好吧,我很难理解为什么需要单身人士.

让我们举一个真实的例子:我有一个CMS的框架
我需要一个类来记录一些信息(让我们坚持PHP).

例:

class Logger{
   private $logs = array();

   public function add($log) {
      $this->logs[]=$log;
   }      
}

当然,这个帮助对象对于CMS的页面请求的输入生命期必须是唯一的.
为了解决这个问题,我们将使它成为一个单例(声明私有构造函数等)

但是为什么在地狱这样一个类不是完全静态的?这可以解决单例模式的需要(这被认为是坏的)例子:

class Logger {
    private static $logs = array();

    public static function add($log) {
        self::$logs[]=$log;
    }
}

通过使这个助手完全静态,当我们需要在我们的应用程序中添加一个日志时,我们只需要静态调用它:Logger :: add(‘log 1’); vs一个单例调用,如:Logger :: getInstance() – > add(‘log 1’);

希望有人让我很容易理解为什么在PHP中使用singleton超过静态类.

编辑

This is a pretty对单身人士的静态讲座,感兴趣的是感谢@James. (请注意,这不解决我的问题)

很多原因.

静态方法基本上是可以从任何范围调用的全局函数,这本身就很难跟踪错误.你也可以根本不使用一个类.

因为你不能有__construct方法,你可能必须在一个地方放置一个init静态方法.现在,他们的代码中的人们不确定init方法是否已被调用.他们再次打电话吗?他们是否必须在代码库中搜索此通话?如果init位于某处,然后被删除或中断,该怎么办?您代码中的许多地方现在依赖于调用init方法的地方.

使用许多单元测试框架,静态方法难以进行单元测试.

还有更多的原因,但很难列出所有这些.

如果您使用DI,单身人士也不是真的需要的.

一个附注. DI允许你的类不依赖于对方,而是依赖于接口.由于他们的关系没有巩固,所以更容易在以后改变你的申请,而一个班级的打破不会打破这两个阶级.

有些情况下,单个状态类是可行的,例如,如果您的方法都不依赖于其他方法(基本上没有任何方法更改类的状态).

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...