代码之家  ›  专栏  ›  技术社区  ›  Young

PHP中对单例模式的一些混淆

  •  0
  • Young  · 技术社区  · 16 年前

    在我的团队中,我被要求编写这样的资源类:

    class MemcacheService
    {
        private static $instance = null;
    
        private function __construct()
        {
    
        }
    
        public static function getInstance($fortest = false)
        {
            if (self::$instance == null)
            {
                self::$instance = new Memcached();
    
                if ($fortest)
                {
                    self::$instance->addServer(MEMTEST_HOST, MEMTEST_PORT);
                }
                else
                {
    
                    self::$instance->addServer(MEM_HOST, MEM_PORT);
                }
            }
    
            return self::$instance;
        }
    }
    

    但我认为在PHP中,每次请求结束后,资源句柄都会被释放并重新初始化。那意味着 MemcacheService::getInstance() 完全相等 new Memcached() 它根本不能称为单例模式。如果我错了,请纠正我。

    当做

    2 回复  |  直到 16 年前
        1
  •  1
  •   Rob    16 年前

    当脚本结束时,PHP将释放大多数资源(文件句柄、数据库连接;但请参见下文),这是正确的。但是,如果您在一个脚本运行中多次访问同一个实例,但没有传递引用,那么这是一种合理的方法,可以将选项卡保留在“memcache连接实例”上,尽管从根本上相当于在长期内使用全局实例。

    (*某些连接(如持久数据库连接)实际上不会像这样被释放,而请求这种连接的下一个脚本可以返回以前打开的一个脚本)

        2
  •  1
  •   Tyler Carter    16 年前

    不,这是正确的单例模式。每次你打电话 getInstance() ,它将检查 self::$instance 是空的。

    if(self::$instance == null)
    

    如果它为空,则会创建一个新的memcached实例,从而 自我:$$实例 不为空,因此下次调用它时,它将返回同一个实例。

    self::$instance = new Memcached();
    
    推荐文章