【发布时间】:2009-01-11 02:13:44
【问题描述】:
我在所有 PHP 类文件中都使用单例模式。
是否会导致用户在网站上的操作与其他用户的操作发生冲突?
例如,当应用程序上线并且我们同时在站点上有多个用户时,执行类似的操作从而调用相同的 PHP 类(在幕后),因为单例阻止了一个类的多个实例并且只返回单个实例。
例如我有一个名为 Search.php 的类,它是一个单例类。此类处理来自网站的所有搜索查询。如果多个用户同时在网站上执行搜索,他们的操作是否会相互冲突,因为它只是可以创建的 Search 类的单个实例。
非常感谢您的宝贵时间。
【问题讨论】:
-
一般当你有这样的“假设”问题时,你应该假设它是不正确的,除非另有证明。如果您甚至不得不在这里询问并且不能自己运行并验证它是否正确,那么您的构建中存在一些需要排除的深层缺陷。要求代码向您证明它符合预期的工作不应该是一项痛苦的工作,如果是这样,您会遇到更大的问题,这些问题将持续存在成百上千个看似无关的微小问题,直到您解决根本问题。
-
在我自己看来,很少有任何情况需要单身。使用它们作为一种通用方法将使您的代码既不可测试又不可扩展,并且会使您的生命周期结束日期明显提前。但是,我也不同意单身人士从来没有正当理由的心态。 99% 的时候,没有理由,这表明要么是懒惰,要么是计划不周。剩下的 1% 的时间是在完成其预期的工作并且不应该改变,不管有多少人抱怨他们。
-
通常应该认识到,使用不当的单例几乎总是对自己造成的问题的回应。当“我没有创建另一个实例”提供相同的解决方案而没有限制时,没有理由说“不能创建另一个实例”。例如,单例的有效使用是创建一个原型器,它需要维护一个要克隆的空白实例化实例,然后通过构造函数以外的方法手动初始化该实例。那真的是我唯一一次使用它们,但我确实一直在使用它们。
-
在上面的例子中,还应该说明实际的原型机不是单例的。只有它产生的空白模板基线对象实例是。原型机本身可以重置或创建为另一个并行实例,并在过程中发布/更新/接收完全不相关的基线集作为情况保证。