Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.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_Performance_Singleton - Fatal编程技术网

在PHP中,在一个页面上多次调用单例方法是否不好?

在PHP中,在一个页面上多次调用单例方法是否不好?,php,performance,singleton,Php,Performance,Singleton,在PHP中,如果我为5个不同的缓存类(memcache、apc、session、file、cookie)创建一个单例方法 然后我有一个主缓存类,它基本上将set()和get()方法路由到相应的缓存类。现在让我们假设我需要在同一个页面上使用会话、cookie、memcache和文件缓存。然后,我的主缓存类需要使用单例为每种缓存类型创建一个新实例 因此,我需要在一个页面上多次调用我的单例方法,如果我在一个页面上设置/获取对缓存的30个不同调用,它将多次调用单例方法 我想知道在一页纸上一遍又一遍地给我

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

然后我有一个主缓存类,它基本上将set()和get()方法路由到相应的缓存类。现在让我们假设我需要在同一个页面上使用会话、cookie、memcache和文件缓存。然后,我的主缓存类需要使用单例为每种缓存类型创建一个新实例

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

我想知道在一页纸上一遍又一遍地给我的单身汉打电话到底是不好还是不好


更新

下面是一些我已经开始的代码,在其中你可以得到一个更好的例子,我正在尝试做什么。。。如果我在一个页面上向memcache添加40次,它将调用ymmemcache类的singleton方法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框架在其下一个主要版本(2.0)中都试图从这两个框架中删除尽可能多的单例


也就是说,当一个给定类只有一个实例是有意义的时候,应该使用单例;这对你来说有意义吗?由您决定;-)

如果你不想一遍又一遍地调用你的单例,你可能想把它存储在一个局部变量中——我想这可能被看作是某种(可能是“过早的”/“无用的”)优化

例如,如果有此类代码:

Singleton::getInstance()->method();
Singleton::getInstance()->method();
Singleton::getInstance()->method();
你应该:

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

我不知道你会从中得到多少,不过…

是的,这就是我被困的地方,有人说很多东西都很好,但我就是不明白。目前,我在一个页面上创建了一个数据库对象,并对该1,所有1个会话对象进行了每个查询,我喜欢坚持使用1。我对对象的了解还不足以理解为什么您会想要更多。1很好的示例,看起来会更好,至少可能会更好,但我想这很难说。我还想看看symfony和Zend Framework对单例“一个对象”或“多个对象”使用了哪些替代方案?嗯,这要看情况而定;;对于数据库连接,您可能只需要一个连接:不需要多次连接到同一个DB——这意味着不需要使用多个
数据库连接实例;;对于某些“
User
”类,您的应用程序中可能有多个用户——这意味着拥有多个
User
实例可能是完全正常的;;即使这些例子是用JAVA编写的,读起来也可能很有趣——还有后续内容^^谢谢,我会看的!我还用一个小的示例函数更新了我的问题,如果你看它,你会发现我可能会多次调用singlton方法,可能有一种更有效的方法,但我不确定