Разве плохо вызывать одноэлементный метод много раз на странице в PHP? - PullRequest
3 голосов
/ 20 января 2010

В PHP, если я создаю одноэлементный метод для примерно 5 различных классов кэширования (memcache, apc, session, file, cookie)

Затем у меня есть основной класс кэша, который в основном маршрутизирует мою set () и получает() методы для соответствующего класса кэширования.Теперь допустим, что мне нужно использовать сеанс, cookie, memcache и кэш файлов на одной странице.Мой класс основного кэша должен был бы тогда создать новый экземпляр 1 раз для каждого из этих типов кэша, используя синглтон.

Так что мне бы пришлось многократно вызывать мои методы синглтона на странице, если бы я должен былустановить / получить 30 различных вызовов кеша на 1 странице, это вызовет метод синглтона много раз.

Мне интересно, будет ли это плохой практикой или не очень хорошо продолжать вызывать мой синглтон снова и сновастраница?


ОБНОВЛЕНИЕ

Ниже приведен код, который я начал, в нем вы можете получить лучший пример того, что я пытаюсь сделать ..Если бы я добавил что-то в memcache 40 раз на странице, он вызвал бы метод singleton для класса 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;
    }

}

1 Ответ

3 голосов
/ 20 января 2010

Вообще говоря, использование синглетонов все больше и больше считается плохой практикой (одна из причин - они усложняют юнит-тестирование, если не невозможно) .

Чтобы проиллюстрировать это: и symfony, и Zend Framework в своей следующей основной версии (2.0) пытаются удалить как можно больше синглетонов из обеих платформ.


При этом синглтоны следует использовать, когда имеет смысл иметь один и только один экземпляр данного класса; имеет ли смысл в вашем случае? Решать вам; -)

Если вы не хотите вызывать свой синглтон снова и снова, вы можете сохранить его в локальной переменной - я полагаю, это может выглядеть как (возможно, «преждевременно» / « бесполезно ") оптимизация.

Например, если вместо этого есть код такого типа:

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

Вы бы получили:

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

Не уверен, сколько вы получите от этого, хотя ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...