当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《PHP单例类是否以某种方式在请求之间共享?》经验,为你挑选了3个好方法。

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

是否有可能导致用户在网站上的操作与其他用户的操作冲突?

例如,当应用程序上线并且我们同时在站点上有多个用户时,执行类似的操作,因此调用相同的PHP类(在场景后面),因为singleton防止了类的多个实例并且只返回一个实例.

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

非常感谢你花时间陪伴.



1> Hans..:

最简洁的答案是不.

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

单例模式只是一种设计类的方法,您可以在其中的任何位置调用它(如全局),而无需关心它是否已经实例化,并且您希望它在内存中保留.



2> Eran Galperi..:

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

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



3> shaikh..:

Singleton模式是更具争议的模式之一。批评者认为,单例将Global State引入到应用程序中,并将单例及其使用类紧密耦合。这导致隐藏的依赖关系和意外的副作用,进而导致难以测试和维护的代码。

批评者进一步指出,在像PHP这样的“共享无内容”架构中使用单例是毫无意义的,因为对象在“请求”中始终是唯一的。在“请求”开始时使用“构建器”和“工厂”模式创建协作者对象图更加容易和清洁。

单例还违反了一些“ SOLID” OOP设计原则和Demeter定律。单例不能序列化。它们不能被子类型化(在PHP 5.3之前),并且因为实例被存储为Singleton的静态属性而不会被垃圾收集。

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有