Сессии и классы PHP - PullRequest
       13

Сессии и классы PHP

0 голосов
/ 04 мая 2011

Я привык к Java, цели c и немного с ++.Теперь я хочу использовать PHP для создания веб-сайта.Я создал несколько классов, но для простоты: 3 класса.

Account - DataMapper - DataManager

Это означает, что я могу получить учетную запись из базы данных.В DataManager я отслеживаю все вещи.Как и userId пользователя.

Дело в том, что обычно все установленные переменные остаются «установленными», но теперь я использую php, и мне нужно их хранить, используя сеанс.DataManager:

<? php
class DataManager
{
    // Hold an instance of the class
    private static $dm;
    private $dataMapper;
    private $dictationView;
    private $userId;

    private function __construct()
    {
        $this->dataMapper = new DataMapper();
        $this->dictationView = new DictationView();
    }

    // The singleton method
    public static function singleton()
    {
        if (!isset(self::$dm)) {
            $c = __CLASS__;
            self::$dm = new $c;
        }

        return self::$dm;
    }

    // Prevent users to clone the instance
    public function __clone()
    {
        trigger_error('Clone is not allowed.', E_USER_ERROR);
    }


    function __get($prop) {
        return $this->$prop;
        }

    function __set($prop, $val) {
        $this->$prop = $val;
        }
}

?>

Если я установлю userId в одноэлементном классе DataManager, в следующий раз, когда я вызову экземпляр класса DataManager, он не запомнит userId.Думаю, где-то мне придется иметь дело с сессией.Как правильно использовать сеансы ООП в DataManager?Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 мая 2011

Теперь вы обращаетесь не к PHP, а к тому, как обрабатывается архитектура клиент-сервер.

Вот изменение, которое предполагает, что вы правильно управляете сеансом (что касается session_start - должно быть в начальной загрузке вашего файла) Я также добавил некоторые исправления тем в ваш код, которые помогут вам в будущем:

    private function __construct()
    {
        $this->dataMapper = new DataMapper();
        $this->dictationView = new DictationView();
    }

    // The singleton method
    public static function singleton()
    {
        if(isset($_SESSION[self::MY_UNIQUE_IDENTIFIER] &&
           get_class($_SESSION[self::MY_UNIQUE_IDENTIFIER] == 'DataManager'){
                   self::$dm = $_SESSION[self::MY_UNIQUE_IDENTIFIER];
        }
        if (!self::$dm) {//LOOK HERE LOOK HERE!!!!!!!!!!!!!!!!!!!!
           $_SESSION[self::MY_UNIQUE_IDENTIFIER] = self::$dm = new self;
        }

        return self::$dm;
    }

    // Prevent users to clone the instance
    public function __clone()
    {
        trigger_error('Clone is not allowed.', E_USER_ERROR);
    }


    function __get($prop) {
        return $this->$prop;
        }

    function __set($prop, $val) {
        $this->$prop = $val;
        }
}
//LOOK HERE LOOK HERE no closing ?>

К некоторым ловушкам я не обращался, поскольку они не являются предметом этого вопроса:

  1. Правильный способ управления сессиями
  2. Адаптация к классу, чтобы разрешить наследование без прерывания сеанса
0 голосов
/ 04 мая 2011

Если вы хотите, вы можете создать оболочку для сессий в PHP.На самом деле это может быть полезно, особенно если вашему приложению позже придется мигрировать на кластер серверов, а сеансы будут перемещаться в распределенный кеш.Затем, чтобы упростить эту миграцию, вам нужно будет предоставить другую реализацию, если тот же интерфейс класса Session.

При этом.

Этот код сам по себе не aхороший ООП.Вы должны прекратить использование синглетонов .И, если для вашего класса требуются экземпляры DataMapper и DictationView, они должны быть созданы вне класса и предоставлены в конструкторе. Вместо создания тесной связи, потому что ваш конструктор создает другие объекты.

...