使我的auth系统成为单例类的优点和缺点

时间:2012-03-30 08:58:28

标签: php oop singleton object-oriented-analysis

我面临着关于我的应用程序的OOP设计的两难选择。我应该让auth类成为单身人士吗?我看到kohana框架和zend框架使用他们的auth类作为单例。使认证类成为单身的缺点是什么?有什么优点?我正在构建的应用程序将是一个企业应用程序,它需要扩展,因此如果它是一个单例,我的auth系统也会扩展吗?

4 个答案:

答案 0 :(得分:3)

这将是一些缺点:

  • 非常难以测试,因为代码与类的名称相关联
  • 全球州的介绍
  • 无法确定效果的原因 - 不相关的方法可能会相互影响
  • 分散整个代码库的身份验证请求
  • 违反LoD

您可以从检查,在什么阶段以及如何对用户进行身份验证(不要与授权混淆)中获益良多。此外,您可能对this topic感兴趣。

<强>更新

以下是您可能感兴趣的视频:

答案 1 :(得分:0)

避免使用单例并仅在硬件对一个对象有限制的情况下使用它 - &gt;每个申请的资源。如果你合并单身,你将无法与系统中的其他东西交换auth类,你将与它叠加。考虑明天你可以收到一个新的要求,告诉你需要使用不同的逻辑,不同的连接等来实现身份验证。另外,关于如何在使用单例后测试你的系统你将如何模拟它?

答案 2 :(得分:0)

不要选择Singleton!这并不比美化的面向对象的命名空间好,事实上 Singleton几乎和使用Global变量一样糟糕,只比使用全局函数库稍微好一点(这本身也很糟糕)。最好将创建的对象发送到你的类。

由于传递给其他对象的PHP 5对象默认是通过引用传递的。它们不会创建新实例(除非使用clone关键字)。这允许任何类型的会话信息作为对象传递给需要它的其他对象。

我可以推荐的最好的事情是创建一个带有会话特定信息的“Session”类。将此类发送到MVC对象。这允许您在没有会话存在的情况下测试系统(或者您可以为此目的创建模型状态)。虽然将一个对象传递给另一个对象会使它们更加耦合而不是理想,只要该类足够原始,就可以在使用相同类的其他系统或应用程序部分中轻松创建。

它还可以在任何给定时间更轻松地传输状态或会话,即使在同一请求中也是如此。

答案 3 :(得分:-3)

在PHP中,一旦请求完成,对象就不会保留在内存中。

因此,即使您将对象设为Singleton,每个请求也都有自己的该类实例。

但是,在单个请求中多次访问对象时会出现差异。在这种情况下,单身人士具有以下优势:

  • 防止创建多个冗余实例,从而减少请求的内存使用量。

  • 在多次访问中共享相同的数据。

例如:Codeigniter的get_instance函数是Singleton Concept的一个实现,每个请求中只使用一个Codeigniter实例。