PHP单例类是否以某种方式在请求之间共享?

时间:2009-01-11 02:13:45

标签: php class singleton

我在所有PHP类文件中使用单例模式。

是否有任何机会导致用户在网站上的操作与其他用户的操作发生冲突?

例如,当应用程序上线并且我们同时在站点上有多个用户时,做类似的事情,因此调用相同的PHP类(在场景后面),因为singleton阻止了一个类的多个实例并且只返回单个实例。

e.g。我有一个名为Search.php的类,它是一个单例类。此类处理来自网站的所有搜索查询。如果多个用户同时在网站上执行搜索,他们的操作会相互冲突,因为它只是可以创建的Search类的一个实例。

非常感谢你的时间。

4 个答案:

答案 0 :(得分:29)

简短的回答是否定的。

每个页面请求都作为唯一实例处理,并且每个用户唯一将它们绑定在一起的是会话cookie。尝试将PHP视为一个应用程序,它在您调用脚本时启动并在脚本完成时终止。它不维护任何状态,并且本身并不知道任何其他PHP实例。

单例模式只是一种设计类的方法,您可以在代码中的任何位置(如全局)调用它,而无需关心它是否已经实例化,并且您希望它保持不变在记忆中。

答案 1 :(得分:28)

每个请求都是自包含的,不会与其他请求共享数据(除非您使用特定的扩展名,例如memcache)。因此,在您的应用程序中使用单例不会影响来自不同用户的单独请求。

你应该关注的是你过度使用单身人士模式。单例是全局的OO版本,如果你不小心可能会导致一些奇怪的错误。最好使用不依赖于全局设置的范围操作,并谨慎使用单例。

答案 2 :(得分:5)

Singleton模式是更具争议性的模式之一。批评者认为,Singletons将Global State引入应用程序并将Singleton及其消费类紧密结合在一起。这会导致隐藏的依赖关系和意外的副作用,从而导致代码更难以测试和维护。

批评者进一步争辩说,在像PHP这样的共享无框架中使用Singleton是没有意义的,其中对象在请求中是唯一的。在Request的开头使用Builders和Factory模式创建协作者对象图更容易,更简洁。

Singletons也违反了几个“SOLID”OOP设计原则和Demeter法则。单身人士无法序列化。它们不能被子类型化(在PHP 5.3之前)并且不会被Garbage Collected,因为实例被存储为Singleton的静态属性。

答案 3 :(得分:2)

我同意,答案是否定的。我现在正在考虑PHP中的Singleton模式,并且已经决定尽管Singleton模式可以用PHP编码,但它并没有真正实现,因为实例不是跨请求共享的(或者存储在进程内存中就是这种情况)对于像ASP.net,Java和Ruby on Rails这样的Web服务器环境?)您可以序列化Singleton实例并将其存储在会话中,但是,它不会跨会话共享。我推测它必须存储在缓存中才能在PHP中完全实现Singleton模式。但我还没有这样做,所以我不确定。