我面临着关于我的应用程序的OOP设计的两难选择。我应该让auth类成为单身人士吗?我看到kohana框架和zend框架使用他们的auth类作为单例。使认证类成为单身的缺点是什么?有什么优点?我正在构建的应用程序将是一个企业应用程序,它需要扩展,因此如果它是一个单例,我的auth系统也会扩展吗?
答案 0 :(得分:3)
这将是一些缺点:
您可以从检查,在什么阶段以及如何对用户进行身份验证(不要与授权混淆)中获益良多。此外,您可能对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实例。