Я привык к 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 ?>
В некоторых ловушках я не обращался здесь, поскольку они не являются предметом этого вопроса: