2012-02-21 2 views
1

У меня есть класс одноплодного, который я использую в качестве части системы CAPTCHA, чтобы сгенерировать код и изображения и т.д.Является ли одноэлементный класс связанным с сеансом в PHP?

Я один сценарий включал в HTML форме, которая загружает класс синглтон, генерируют код и изображения, и выводит его в браузер. Затем у меня есть другой скрипт для проверки и обработки формы. Это загружает класс singleton для извлечения экземпляра, который был создан ранее, и вызывает функцию для проверки кода.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я проверяю форму, код, который был сгенерирован в форме, изменился или полностью отсутствует, когда я пришел, чтобы проверить его!

Я еще не запускал или не хранил ничего в php-сессии, но на странице, на которой загружается форма, создается сеанс. Является ли экземпляр singleton каким-то образом связанным с этим сеансом? Если это именованный сеанс или что-то еще?

OR ... я полностью не понял, как работают одноэлементные классы? В таком случае может ли кто-нибудь сказать мне, как я могу получить экземпляр класса, созданного на странице формы html, для повторного использования для проверки кода в скрипте обработки формы? - И, может быть, расскажи мне, как я должен использовать одиночные игры!

Большое спасибо.

+0

[Относительно: «как я должен использовать одиночные игры»] (http: // stackoverflow.com/questions/4595964/who-needs-singletons/4596323 # 4596323) – Gordon

+0

обновил мой ответ значимым сеансом persistent singleton example – Kaii

+0

Во-первых, благодаря всем ответам и комментариям ниже, я думаю, что понимаю: когда я называю singleton в форме Я фактически создаю новый экземпляр синглтона, а не получаю предыдущий. Я прошел классы как объекты до (между классами), но не сериализован через сеанс - это похоже на JSON? – Chris

ответ

2

ИЛИ ... я совершенно не понял, как синглтон классы работают?

Частично. Поскольку PHP не имеет ASP.NET-подобных переменных приложения, объекты в PHP живут до тех пор, пока выполняется запрос, если они не сериализованы (например, в сеансе).

В качестве решения вашей проблемы: сохраните код captcha (или класс captcha, который является немного overkill imho) в переменной сеанса, например $_SESSION['captcha'].

2

Синглы существуют на время запроса, а не на продолжительность сеанса.

Идея singleton заключается в предоставлении доступа к одному и тому же объекту во всех включенных сценариях без необходимости использования какой-либо явной логики инициализации.

Итак, первый звонок $foo = MyObject::singleton() создает новый MyObject, но второй вызов просто возвращает этот объект вместо создания нового. Это невероятно полезно для классов, которые обращаются к внешним ресурсам, таким как базы данных и файлы.

1

Нет, это не так.

Вам нужно будет сериализовать объект singleton и сохранить его в сеансе, когда закончится выполнение кода. Когда будет отображаться следующая страница, вы можете выполнить неэриализацию объекта со своего сеанса.

PHP автоматически сериализует/нетериализирует объекты, когда вы назначаете их сеансу.

Это работает только в соответствии с предварительным условием, что ваш singleton не использует идентификаторы ссылок для внешних ресурсов.

Вот пример реализации берется из comments in PHP docs

class SessionSingleton { 
    /** 
    * Returns an instance of the singleton class. 
    * @return object  The singleton instance 
    */ 
    public static function _instance() 
    { 
     // Start a session if not already started 
     Session::start(); 

     if (false == isset($_SESSION[ self::$_singleton_class ])) 
     { 
      $class = self::$_singleton_class; 
      $_SESSION[ self::$_singleton_class ] = new $class; 
     } 

     return $_SESSION[ self::$_singleton_class ];  
    } 

    /** 
    * Destroy the singleton object. Deleting the session variable in the 
    * destructor does not make sense since the destructor is called every 
    * time the script ends. 
    */ 
    public static function _destroy() 
    { 
     $_SESSION[ self::$_singleton_class ] = null; 
    } 

    /** 
    * Initialize the singleton object. Use instead of constructor. 
    */ 
    public function _initialize($name) 
    { 
     // Something... 
    } 

    /** 
    * Prevent cloning of singleton. 
    */ 
    private function __clone() 
    { 
     trigger_error("Cloning a singleton object is not allowed.", E_USER_ERROR); 
    } 

    private static $_singleton_class = __CLASS__; 
} 
+1

Возможно, не удастся обеспечить надежную сериализацию. Обработки ресурсов не могут сохраняться в сеансе. – Polynomial

+0

@Полиномиальный Вы правы. – Kaii

+1

Стоит упомянуть, что вы не можете ожидать, что вы можете сериализовать синглтон, потому что он больше не может быть «одиночным» ('$ clone = unserialize (serialize ($ singleton))). – KingCrunch

Смежные вопросы