可能是重复问题:
谁需要单例模式?
我在想,在php脚本中使用单例模式有什么缺点。我经常使用它们,但有时无法理解开发人员的批评。以下是一些例子:
我有一个请求类:
清理POST、GET、COOKIE输入数据并在全局范围内严格使用它而不是全局数组。像这样:
$request = Request::getInstance();
$firstname = $request->post('firstname', $additionalFilters);
每个请求只有一个请求。为什么在这种情况下使用单例是一个坏主意?
对于 $_SESSION 也是一样:
我有一个 Session 类(单例),它代表了 $_SESSION 数组,因为只有一个会话并且我在全局范围内使用它。
数据库
$mysql = DB::getInstance('mysql', 'dbname'); //pseudo
$sqlite = DB::getInstance('sqlite', 'dbname'); //pseudo
对于每种类型的数据库,我只希望有一个对象,而不是多个。我认为否则会存在混乱的风险。
唯一行
此外,我经常使用类来表示/使用数据库表的唯一行。
$article = Article::getInstance($id);
$navigation = Navigation::getInstance($id);
我认为这种做法有很多好处。我不想要一个代表唯一行的第二个对象。为什么单例在这里是一个坏主意呢?
实际上,我的大多数(几乎全部)类都没有公共构造函数,而是始终具有像getInstance($id)或create()这样的静态方法,因此类本身处理可能的实例(这并不意味着它们都是单例定义)。
所以我的问题是:还有我没有意识到的任何缺点吗?当反对单例时,单例怀疑者考虑了哪些具体情况?
编辑:
现在,您有一个封装$_POST的单例,但如果您没有$_POST,而想要使用文件作为输入怎么办?在这种情况下,如果您有一个抽象的输入类,并实例化POSTInput来通过发布的数据管理输入,则会更加方便。
好的,有有效的优点。我没有意识到这一点。特别是关于Request类的那一点。
但我仍然对这种方法持怀疑态度。假设我有一个“Functionality”类,它执行具体请求(例如留言板组件)。在该类中,我想获取发送的参数。因此,我获得了Request的单例实例。
$req = Request::getInstance();
$message = $req->post('message');
这种方式,只有我的功能对象关心一个请求类。当我使用非单例模式时,我需要某种额外的类/函数来管理每个请求获取有效的请求对象。这样,我的Functionality类就不需要知道关于该管理类的信息,但在我看来,仍然存在一种依赖/问题:每次创建Functionality对象的实例时,都有可能忘记设置请求对象。当然,我可以在创建Functionality时定义一个非可选参数。但总的来说,这会导致参数过载。或者不会?
$object2 = $object;
这样做,它们都将指向同一个实例。但我也喜欢单例模式 :p - Hugo Mota