Синглтон не возвращает существующий экземпляр - PullRequest
0 голосов
/ 04 января 2012

Вот так я настроил свой синглтон

<?php
    class MySingleton
    {
        private static $instance;
        private static $you;

        private function __construct()
        {
            $this->you = "foo";     
        }

        public static function singleton()
        {
            if (!isset(self::$instance)) {              
                $className = __CLASS__;
                self::$instance = new $className;
            }
            return self::$instance;
        }

        public function getYou()
        {
            return $this->you;
        }       
        public function setYou($val)
        {
            $this->you = $val;
        }

    }
?>

В file1.php я делаю это:

require_once('session.php');
$session = MySingleton::singleton();
$session->setYou('bar');
echo $session->getYou(); //echoes 'bar'

В file1.php у меня есть гиперссылка на file2.php, где у меня есть этот код:

require_once('session.php');
$session = MySingleton::singleton();
echo ($session->getYou()); //prints 'foo' which gets set in the constructor

Кажется, он создает новый экземпляр для file2, поэтому $you имеет значение по умолчанию foo. Куда я иду не так? Почему я не получаю экземпляр, который использовал в file1.php?

Ответы [ 4 ]

3 голосов
/ 04 января 2012

Статические данные работают только в одной программе PHP.

Если два ваших скрипта работают как отдельные страницы, они не будут иметь общего состояния.

3 голосов
/ 04 января 2012

Синглтон в PHP действителен только для текущего запроса (поскольку HTTP не имеет состояния).

Если вы хотите сохранить состояние этого объекта, сохраните его в сеансе:

class MySingleton
    {
        private static $instance;
        private static $you;

        private function __construct()
        {
            $this->you = "foo";     
        }

        public static function singleton()
        {
            session_start();
            if (!($_SESSION['MyInstance'] instanceof MySingleton)) {              
                $className = __CLASS__;
                $_SESSION['MyInstance'] = new $className;
            }
            return $_SESSION['MyInstance'];
        }

        public function getYou()
        {
            return $this->you;
        }       
        public function setYou($val)
        {
            $this->you = $val;
        }

    }
3 голосов
/ 04 января 2012

Синглтоны считаются «одиночными» во время ОДНОГО запроса.Для всего остального вам придется сериализовать объект или использовать Sessions.

1 голос
/ 04 января 2012

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

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