некоторые путаницы с одноэлементным шаблоном в PHP - PullRequest
0 голосов
/ 20 марта 2010

В моей команде мне сказали написать класс ресурсов следующим образом:

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 ]

1 голос
/ 20 марта 2010

Вы правы, что PHP освободит большинство ресурсов (файловые дескрипторы, соединения с базой данных; но см. Ниже), когда скрипт завершится. Однако, если вы обращаетесь к одному и тому же экземпляру несколько раз в ходе выполнения сценария и не передаете ссылку, то это разумный способ сохранить вкладки в «экземпляре подключения к memcache», хотя в принципе эквивалентно использованию глобального в долгосрочной перспективе.

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

1 голос
/ 20 марта 2010

Нет, это правильный шаблон синглтона. Каждый раз, когда вы звоните getInstance(), он будет проверять, является ли self::$instance нулевым.

if(self::$instance == null)

Если он равен нулю, он создает новый экземпляр Memcached, в результате чего self::$instance не равен нулю, поэтому при следующем вызове он возвратит тот же экземпляр.

self::$instance = new Memcached();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...