2

我面临着关于我的应用程序的 OOP 设计的两难境地。我是否应该将身份验证类设为单例。我看到 kohana 框架和 zend 框架将它们的身份验证类用作单例。将身份验证类设为单例有什么缺点?有哪些优点?此外,我正在构建的应用程序将是一个企业应用程序,它需要扩展,那么如果我的身份验证系统是单例的,我的身份验证系统也会扩展吗?

4

4 回答 4

3

这里会有一些缺点:

  • 极难测试,因为代码与类名相关联
  • 引入全局状态
  • 无法确定影响的原因 - 不相关的方法可能会相互影响
  • 在整个代码库中分散身份验证请求
  • 违反LoD

您可能会从检查中受益匪浅,在什么阶段以及如何准确地对用户进行身份验证(不要与授权混淆)。此外,您可能会对这个主题感兴趣。

更新

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

于 2012-03-30T09:10:16.553 回答
0

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

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

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

它还使得在任何给定时间传输状态或会话变得更加容易,即使在同一个请求中也是如此。

于 2012-03-30T09:05:56.850 回答
0

避免使用单例,并且仅在硬件对每个应用程序的一个对象-> 资源有限制的情况下使用它。如果您合并单例,您将无法将身份验证类与系统中的其他东西交换,您将与它堆叠在一起。考虑到明天你可能会收到一个新要求,说你需要使用不同的逻辑、不同的连接等来实现身份验证。还有关于如何在使用单例后测试你的系统,你将如何模拟它?

于 2012-03-30T09:04:00.993 回答
-3

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

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

但是当在一个请求中多次访问对象时,差异就会出现。在这种情况下,单例具有以下优点:

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

  • 跨多个访问共享相同的数据。

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

于 2012-03-30T09:03:08.997 回答