我在所有PHP类文件中使用单例模式.
是否有可能导致用户在网站上的操作与其他用户的操作冲突?
例如,当应用程序上线并且我们同时在站点上有多个用户时,执行类似的操作,因此调用相同的PHP类(在场景后面),因为singleton防止了类的多个实例并且只返回一个实例.
例如,我有一个名为Search.php的类,它是一个单例类.此类处理来自网站的所有搜索查询.如果多个用户同时在网站上执行搜索,他们的操作会相互冲突,因为它只是可以创建的Search类的单个实例.
非常感谢你花时间陪伴.
最简洁的答案是不.
每个页面请求都作为唯一实例处理,并且每个用户唯一将它们绑定在一起的是会话cookie.尝试将PHP视为一个应用程序,它在您调用脚本时启动并在脚本完成时终止.它不维护任何状态,并且本身并不知道任何其他PHP实例.
单例模式只是一种设计类的方法,您可以在其中的任何位置调用它(如全局),而无需关心它是否已经实例化,并且您希望它在内存中保留.
每个请求都是自包含的,不与其他请求共享数据(除非您使用特定的扩展,如memcache).因此,在您的应用程序中使用单例不会影响单独用户的单独请求.
你应该关注的是你过度使用单身模式.单例是全局的OO版本,如果你不小心可能会导致一些奇怪的错误.最好使用不依赖于全局设置的作用域操作,并谨慎使用单例.
Singleton模式是更具争议的模式之一。批评者认为,单例将Global State引入到应用程序中,并将单例及其使用类紧密耦合。这导致隐藏的依赖关系和意外的副作用,进而导致难以测试和维护的代码。
批评者进一步指出,在像PHP这样的“共享无内容”架构中使用单例是毫无意义的,因为对象在“请求”中始终是唯一的。在“请求”开始时使用“构建器”和“工厂”模式创建协作者对象图更加容易和清洁。
单例还违反了一些“ SOLID” OOP设计原则和Demeter定律。单例不能序列化。它们不能被子类型化(在PHP 5.3之前),并且因为实例被存储为Singleton的静态属性而不会被垃圾收集。