PHP中的单例对象
我正在学习PHP并试图理解Singleton对象,但不能真正理解它到底意味着什么PHP中的单例对象,php,design-patterns,singleton,Php,Design Patterns,Singleton,我正在学习PHP并试图理解Singleton对象,但不能真正理解它到底意味着什么 如果我创建一个单例对象,它是所有客户端的一个对象还是每个客户端(浏览器会话)都有自己的单例对象?我认为每个客户端都可以有一个对象实例,但只有一个 单例对象是特定类的单个实例。在每个PHP请求中,这个实例都会出现,甚至不是每个会话,而是每个人在您的系统上发出的请求 有关更多知识,请查看wikipedia页面,以及如何创建模式:PHP会话不会以本机方式共享数据,因此Singleton只需确保您在会话中使用一个且仅使用一
如果我创建一个单例对象,它是所有客户端的一个对象还是每个客户端(浏览器会话)都有自己的单例对象?我认为每个客户端都可以有一个对象实例,但只有一个
单例对象是特定类的单个实例。在每个PHP请求中,这个实例都会出现,甚至不是每个会话,而是每个人在您的系统上发出的请求
有关更多知识,请查看wikipedia页面,以及如何创建模式:PHP会话不会以本机方式共享数据,因此Singleton只需确保您在会话中使用一个且仅使用一个对象实例,这对于配置、数据库连接、缓存对象等非常方便
有几种方法可以实现这一点。首先,是使用静态方法。虽然它非常简单,但它促进了紧密耦合,并且很难进行单元测试,这在项目变得更大时成为一个主要问题。第二种方法是简单地将一个对象保存在某个容器属性中,并通过依赖于单例实例的所有方法传递该容器。一开始比较困难,实现这一点的方法有很多,最常见的是大量的依赖注入方法。如果您来自Java领域,您可能会有这样的印象,即单个实例是整个Web服务器上的单个实例 在PHP中,每当一个新请求到达服务器时,PHP都会运行所有代码并创建新的对象和实例。因此,与Java不同,在PHP中,singleton将是请求上下文中唯一的实例,而不是服务器
我希望这能回答您的问题:)Singleton是一种设计模式,基本上意味着:
- 确保一个类在任何时候只能有一个实例
- 提供从内部任何位置对单个实例的全局访问
你的申请
class Singleton
{
protected static $instance = null;
protected function __construct()
{
}
public static function getInstance()
{
if (!isset(static::$instance)) {
static::$instance = new static;
}
return static::$instance;
}
}
令人惊讶的是,PHP中不需要单例,原因如下
gordon博客的链接为什么它在PHP中没有用:PHP中的所有对象(单例或其他)仅在请求期间存在,除非您以某种形式的永久存储方式显式维护它们。单例与编程语言或服务器环境关系不大。这是一种非常通用(也非常有限!)的设计模式。看看我心目中的公认答案。这是一段时间以来公认的答案。Java和PHP中的singleton实现确实非常不同。PHP和Java中的singleton仍然可以具有相同的意义,这取决于范围。虽然可以实现这一点,但这并不是实现这一点的“自然方式”。引用对这个问题的第一条评论:“PHP中的所有对象(单例或其他)仅在请求期间存在,除非您以某种形式的永久存储明确维护它们”——这正是我想用这个答案强调的一点,因为OP似乎很难准确理解这一方面:“它是所有客户端的一个对象,还是每个客户端(浏览器会话)都有自己的Singelton对象?”。