我在所有 PHP 类文件中使用单例模式。
是否会导致用户在网站上的操作与其他用户的操作发生冲突?
例如,当应用程序上线并且我们同时在站点上有几个用户时,做类似的事情,从而调用相同的 PHP 类(在幕后),因为单例阻止了一个类的多个实例并且只返回一个实例.
例如,我有一个名为 Search.php 的类,它是一个单例类。此类处理来自网站的所有搜索查询。如果多个用户同时在站点上执行搜索,他们的操作是否会相互冲突,因为它只是可以创建的 Search 类的单个实例。
非常感谢你花时间陪伴。
最简洁的答案是不。
每个页面请求都作为一个唯一的实例进行处理,唯一将每个用户的请求联系在一起的是会话 cookie。试着把 PHP 想象成一个应用程序,它在你调用脚本时启动,在脚本完成时终止。它不维护任何状态,也不知道任何其他 PHP 实例。
单例模式只是您设计类的一种方式,您可以在代码中的任何位置(如全局)调用它,而不必关心它是否已经被实例化并且您希望它保留在内存中。
每个请求都是自包含的,不与其他请求共享数据(除非您为此使用特定的扩展,例如 memcache)。因此,在您的应用程序中使用单例不会影响来自不同用户的单独请求。
你应该关心的是你对单例模式的过度使用。单例是全局的 OO 版本,如果您不小心,可能会导致一些奇怪的错误。最好使用不依赖全局设置的作用域操作,并谨慎使用单例。
单例模式是比较有争议的模式之一。批评者认为,单例将全局状态引入应用程序,并将单例及其消费类紧密耦合。这会导致隐藏的依赖关系和意想不到的副作用,进而导致代码更难测试和维护。
批评者进一步认为,在 PHP 这样的无共享架构中使用单例是没有意义的,因为无论如何,对象在请求中都是唯一的。通过在请求开始时使用 Builders 和 Factory 模式来创建协作者对象图更加容易和清晰。
Singletons also violate several of the "SOLID" OOP design principles and the Law of Demeter. Singletons cannot be serialized. They cannot be subtyped (before PHP 5.3) and won't be Garbage Collected because of the instance being stored as a static attribute of the Singleton.
我同意,答案是否定的。我现在正在考虑 PHP 中的单例模式,并决定虽然单例模式可以用 PHP 编码,但它并没有真正实现,因为实例没有跨请求共享(或存储在进程内存中,就是这种情况对于像 ASP.net、Java 和 Ruby on Rails 这样的 Web 服务器环境?)您可以序列化 Singleton 实例并将其存储在会话中,但仍然不能跨会话共享。我推测它必须存储在缓存中才能在 PHP 中完全实现单例模式。但我还没有这样做,所以我不确定。