在PHP页面上多次反复调用单例方法是否不好?

PHP中,如果我为5种不同的缓存类(memcache,apc,session,file,cookie)创建单例方法

然后,我有一个主要的缓存类,该类基本上将set()和get()方法路由到适当的缓存类.现在说我需要在同一页面上使用会话,cookie,内存缓存和文件缓存.然后,我的主缓存类需要使用单例为这些缓存类型中的每一种创建一个新实例1次.

因此,我将需要在页面上多次调用我的单例方法,如果我要在一页上设置/获取30个不同的对缓存的调用,它将多次调用单例方法.

我想知道在页面上一遍又一遍地打电话给我的单身人士是不好的做法还是不是很好?

更新

下面是我已经开始的一些代码,在其中您可以得到我正在尝试做的更好的示例…如果我要在页面上将内容添加到memcache 40次,它将为ym memcache类调用单例方法40次

/**
* Set a key/value to cache system.
*
* @param   string        type of cache to store with
* @param   string|array  keys, or array of values
* @param   mixed         value (if keys is not an array)
* @return  void
*/  
public function set($type, $keys, $value = FALSE, $options_arr)
{
    if (empty($keys))
        return FALSE;

    if ( ! is_array($keys))
    {
        $keys = array($keys => $val);
    }

    // Pick our Cache system to use
    switch ($type) {
        case "memcache":
            // Cache item to memcache
            $this->memcache = Memcache::getInstance();
            $this->memcache->get($keys, $value, $options);
            break;

        case "apc":
            // Cache item to APC
            $this->apc = APC::getInstance();
            $this->apc->get($keys, $value, $options);
            break;

        case "session":
            // Cache item to Sessions
            foreach ($keys as $key => $val)
            {
                // Set the key
                $_SESSION[$key] = $val;
            }
            break;

        case "cookie":
            // Cache item to Cookie
            break;

        case "file":
            // Cache item to File
            break;
    }

}

解决方法:

一般来说,越来越多的人认为使用单例是不好的做法(原因之一是,即使不是没有可能,它们也会使单元测试更加困难).

为了说明这一点:symfony和Zend Framework的下一个主要版本(2.0)都试图从两个框架中删除尽可能多的单例.

话虽如此,当一个给定类只有一个实例并且一个实例只有一个有意义时,应该使用单例.您的情况有意义吗?由您决定;-)

如果您不想一遍又一遍地调用单身人士,则可能希望将其存储在局部变量中-我想它可能被视为某种(也许是“过早的” /“无用的”)优化.

例如,如果具有这种代码,则:

Singleton::getInstance()->method();
Singleton::getInstance()->method();
Singleton::getInstance()->method();

您将拥有:

$s = Singleton::getInstance();
$s->method();
$s->method();
$s->method();

不过,不确定从中获得多少收益…

上一篇:onpageshow 事件及应用


下一篇:增加存储的数据后,mysql性能会下降.需要系统诊断程序的提示