Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的单例对象_Php_Design Patterns_Singleton - Fatal编程技术网

PHP中的单例对象

PHP中的单例对象,php,design-patterns,singleton,Php,Design Patterns,Singleton,我正在学习PHP并试图理解Singleton对象,但不能真正理解它到底意味着什么 如果我创建一个单例对象,它是所有客户端的一个对象还是每个客户端(浏览器会话)都有自己的单例对象?我认为每个客户端都可以有一个对象实例,但只有一个 单例对象是特定类的单个实例。在每个PHP请求中,这个实例都会出现,甚至不是每个会话,而是每个人在您的系统上发出的请求 有关更多知识,请查看wikipedia页面,以及如何创建模式:PHP会话不会以本机方式共享数据,因此Singleton只需确保您在会话中使用一个且仅使用一

我正在学习PHP并试图理解Singleton对象,但不能真正理解它到底意味着什么


如果我创建一个单例对象,它是所有客户端的一个对象还是每个客户端(浏览器会话)都有自己的单例对象?

我认为每个客户端都可以有一个对象实例,但只有一个


单例对象是特定类的单个实例。在每个PHP请求中,这个实例都会出现,甚至不是每个会话,而是每个人在您的系统上发出的请求


有关更多知识,请查看wikipedia页面,以及如何创建模式:

PHP会话不会以本机方式共享数据,因此Singleton只需确保您在会话中使用一个且仅使用一个对象实例,这对于配置、数据库连接、缓存对象等非常方便


有几种方法可以实现这一点。首先,是使用静态方法。虽然它非常简单,但它促进了紧密耦合,并且很难进行单元测试,这在项目变得更大时成为一个主要问题。第二种方法是简单地将一个对象保存在某个容器属性中,并通过依赖于单例实例的所有方法传递该容器。一开始比较困难,实现这一点的方法有很多,最常见的是大量的依赖注入方法。

如果您来自Java领域,您可能会有这样的印象,即单个实例是整个Web服务器上的单个实例

在PHP中,每当一个新请求到达服务器时,PHP都会运行所有代码并创建新的对象和实例。因此,与Java不同,在PHP中,singleton将是请求上下文中唯一的实例,而不是服务器


我希望这能回答您的问题:)Singleton是一种设计模式,基本上意味着:

  • 确保一个类在任何时候只能有一个实例
  • 提供从内部任何位置对单个实例的全局访问
    你的申请
PHP中的单例示例:

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对象?”。