Intereting Posts
как изменить путь по умолчанию для php в xampp? Комбинированные объекты на основе выбранного элемента в другом поле со списком Настраивание страниц PHP и MySQL Регулярное выражение, преобразующее текстовые списки в html в PHP Почему, если я зарегистрировался на своем веб-сайте как зарегистрированный пользователь, я не могу получить доступ к другим страницам после установки правил сеанса? Синтаксическая ошибка в квадратных скобках Php PHP preg_match_all + str_replace php mcrypt эквивалент для sagepay на сервере Windows MySQLi-запрос vs PHP Array, который быстрее? Что это значит, когда var_dump сообщает о неправильной длине строки? Когда нужно использовать intval и когда int Какое время использовать real_escape_string? Когда данные поступают в POST или непосредственно перед составлением запроса? Как взять резервную копию базы данных без использования phpmyadmin в Mysql Xampp Преобразование PHP RegEx в JavaScript RegEx Проверка тайм-аута сеанса в Laravel

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

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

Учетная запись – DataMapper – DataManager

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

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

<? 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? Благодаря!

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

Тем не менее.

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

Теперь вы говорите не о 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. Корректировка класса для разрешения наследования без сбоя сеанса