Плохо ли много раз вызывать одноэлементный метод снова и снова на странице в PHP?


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

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

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

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


ОБНОВЛЕНИЕ

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

}
Author: JasonDavis, 2010-01-20

1 answers

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

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


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

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

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

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

У вас было бы:

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

Хотя не уверен, сколько вы от этого выиграете...

 3
Author: Pascal MARTIN, 2010-01-20 00:08:41