好吧,我很难理解为什么需要单身人士.
让我们举一个真实的例子:我有一个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允许你的类不依赖于对方,而是依赖于接口.由于他们的关系没有巩固,所以更容易在以后改变你的申请,而一个班级的打破不会打破这两个阶级.