За последние 24 часа нас посетили 18003 программиста и 1654 робота. Сейчас ищут 1515 программистов ...

Классы "Session" и "User" - авторизация

Тема в разделе "Решения, алгоритмы", создана пользователем TheShock, 31 май 2009.

  1. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Вижу, это актуальная тема. По многочисленным просьбам выкладываю на всеобщее обозрение свой подход в авторизации и регистрации пользователей. Следует учесть, что у меня это есть часть одной большой системы, потому чтобы заработало у вас - надо будет кое что поменять. Что? Читайте комменты по ходу, которые я, специально для php.ru, написал на русском.

    Сразу скажу, что я знаю, что такое phpDoc и не использую его специально. Субъективно мне он кажется неудобным. Если вы хотите - можете отредактировать эти классы с комментариями в стиле phpDoc.

    Класс User стоит немного отредактировать, если вы хотите его использовать - он создан для такой структуры проекта, какая используется у меня. У вас он в таком виде, скорее всего, будет работать некоректно. Подробнее - читайте комментарии внутри класса.

    Также предупреждаю - данный код еще не прошел боевой проверки. Его использование я планировал начать через несколько дней. Потому - возможны мелкие недоработки. По ходу буду править и сообщать об изменениях в этой теме. Пока - отвечаю на вопросы

    Лицензия: GPL v3.

    PHP:
    1. <?php
    2. /**
    3.  
    4.  *  Класс Session v. 0.1.0.0
    5.  *      Удобная оберка для стандартных сессий
    6.  
    7.  *  Примечание:
    8.  *      Класс статичный, потому любой метод надо вызывать через двойное двоеточие, например:
    9.  *      Session::start();
    10.  *      $user = Session::get('user');
    11.  *      Session::set('var', $variable);
    12.  
    13.  *  Метод isCreated ()
    14.  *      Проверяет, установленны ли Cookie сессии и правильные ли они
    15.  *      @ Return boolean
    16.  
    17.  *  Метод start ()
    18.  *      Инициирует сессию. Перед любой попыткой вызвать метод ниже надо обязательно стартовать сессию!
    19.  *      Если вы не уверены, была ли сессия начата - можете вызвать этот метод снова.
    20.  *      Если сессия не была начата, метод ее начнет. Иначе - вызов будет проинорирован
    21.  
    22.  *  Метод set (String $name, Mixed $value)
    23.  *      Добавляет в сессию переменную с именем $name и значением $value
    24.  
    25.  *  Метод get (String $name)
    26.  *      Возвращает значение переменной $name или null
    27.  *      @ Return Mixed
    28.  
    29.  *  Метод del (String $name)
    30.  *      Удаляет переменную с именем $name
    31.  
    32.  *  Метод clear ()
    33.  *      Очищает все значения, переданные сессии, но сессию не уничтожает
    34.  
    35.  *  Метод destroy ()
    36.  *      Уничтожает сессию, при этом стираются Cookie, и все значения, переданные в сессию
    37.  
    38.  *  Метод restart ()
    39.  *      Уничтожает, а потом стартует сессию
    40.  
    41.  *  Метод getArray ()
    42.  *      Возвращает массив всех переменных, переданных в сессию.
    43.  *      Рекомендуется использовать только для отладки, а все значения
    44.  *      получать при помощи метода get
    45.  *      @ Return Array
    46.  
    47.  *  Метод commit ()
    48.  *      Сохраняет все значения и закрывает сессию. После вызова этого
    49.  *      метода работа с сессией невозможна, пока сессия не будет снова
    50.  *      запущенна методом start()
    51.  
    52.  */
    53.  
    54. class Session {
    55.     private static $lifetime = 1200000; // 14 дней
    56.     private static $cookieName = "cid";
    57.     private static $started = false;
    58.  
    59.     public static function isCreated () {
    60.         return (!empty($_COOKIE[self::$cookieName]) and ctype_alnum($_COOKIE[self::$cookieName])) ? true : false;
    61.     }
    62.  
    63.     public static function start () {
    64.         if(!self::$started) {
    65.             // Если содержи
    66.             if(!empty($_COOKIE[self::$cookieName]) and !ctype_alnum($_COOKIE[self::$cookieName])) {
    67.                 unset($_COOKIE[self::$cookieName]);
    68.             }
    69.             session_set_cookie_params (self::$lifetime, '/');
    70.             session_name (self::$cookieName);
    71.             session_start ();
    72.             self::$started = true;
    73.         }
    74.     }
    75.  
    76.     public static function set ($name, $value) {
    77.         if(self::$started) {
    78.             $_SESSION[$name] = $value;
    79.         } else {
    80.             trigger_error('You should start Session first', E_USER_WARNING);
    81.         }
    82.     }
    83.  
    84.     public static function get ($name) {
    85.         if(self::$started) {
    86.             return isset($_SESSION[$name]) ? $_SESSION[$name] : null;
    87.         } else {
    88.             trigger_error('You should start Session first', E_USER_WARNING);
    89.         }
    90.     }
    91.  
    92.     public static function del ($name) {
    93.         if(self::$started) {
    94.             unset($_SESSION[$name]);    
    95.         } else {
    96.             trigger_error('You should start Session first', E_USER_WARNING);
    97.         }
    98.     }
    99.  
    100.     public static function clear () {
    101.         if(self::$started) {
    102.             unset($_SESSION);
    103.         } else {
    104.             trigger_error('You should start Session first', E_USER_WARNING);
    105.         }
    106.     }
    107.  
    108.     public static function destroy () {
    109.         if(self::$started) {
    110.             self::$started = false;
    111.             unset($_COOKIE[self::$cookieName]);
    112.             setcookie(self::$cookieName, '', 1, '/');
    113.             session_destroy();
    114.         } else {
    115.             trigger_error('Session is not started!', E_USER_WARNING);
    116.         }
    117.     }
    118.  
    119.     public static function restart () {
    120.         self::destroy();
    121.         self::start();
    122.     }
    123.  
    124.     public static function getArray () {
    125.         if(self::$started) {
    126.             return $_SESSION;
    127.         } else {
    128.             trigger_error('You should start Session first', E_USER_WARNING);
    129.         }
    130.     }
    131.  
    132.     public static function commit () {
    133.         if(self::$started) {
    134.             session_write_close();
    135.             self::$started = false;
    136.         } else {
    137.             trigger_error('You should start Session first', E_USER_WARNING);
    138.         }
    139.     }
    140. }
    141.  
    142. ?>
    PHP:
    1. <?php
    2. /**
    3.  
    4.  *  Класс User v 0.1.0.0
    5.  *      Класс авторизации и регистрации пользователя.
    6.  
    7.  *  Примечание:
    8.  *      Класс статичный, потому любой метод надо вызывать через двойное двоеточие, например:
    9.  *      if ( User::isLogined() ) {
    10.  
    11.  *  Метод check ()
    12.  *      Проверяет, авторизировался ли пользователь, этот метод следует вызвать до вызова любого другого метода класса
    13.  
    14.  *  Метод isLogged ()
    15.  *      Возвращает значение, залогинен ли пользователь в этом сеансе
    16.  *      @ Return boolean
    17.  
    18.  *  Метод register (String $nick, String $pass)
    19.  *      Регистрирует пользователя с ником $nick (если не занят) и паролем $pass
    20.  *      @ Return TRUE или "NickBusy"
    21.  *      ВНИМАНИЕ: Данный метод нуждается в доработке, если вы хотите его использовать у себя на сайте
    22.  *          подробнее - в комментариях метода
    23.  
    24.  *  Метод login (String $nick, String $pass)
    25.  *      Авторизует пользователя с ником $nick (если существует) и паролем $pass (если правильный)
    26.  *      @ Return TRUE или "WrongPass" или "WrongNick"
    27.  *      ВНИМАНИЕ: Данный метод нуждается в доработке, если вы хотите его использовать у себя на сайте
    28.  *          подробнее - в комментариях метода
    29.  
    30.  *  Метод logout ()
    31.  *      Делает пользователя неавторизированным на сайте и запоминает это состояние
    32.  *      ВНИМАНИЕ: Данный метод нуждается в доработке, если вы хотите его использовать у себя на сайте
    33.  *          подробнее - в комментариях метода
    34.  
    35.  *  Метод getInstance ()
    36.  *      Возвращает объект пользователя. В этом объекте могут быть данные о имени, дате регистрации,
    37.  *      количестве сообщений и так далее. Вы можете отредактировать класс так, чтобы возвращался
    38.  *      ассоциативный массив вместо объекта. Смотрите код и комментарии методов register, login и logout
    39.  *      @ Return Object
    40.  
    41.  */
    42. class User {
    43.     protected static $instance = null;
    44.     protected static $logged = false;
    45.  
    46.     public static function check () {
    47.         Session::start();
    48.         if ($data = Session::get('User')) {
    49.             $data = unserialize($data);
    50.             self::$logined  = $data['logined'];
    51.             self::$instance = $data['instance'];
    52.         } else {
    53.             // Не может быть сессии без переменной User. Должно быть, это ошибка
    54.             Session::restart();
    55.             // Пользователь будет незалогиненым
    56.             self::logout();
    57.         }
    58.     }
    59.  
    60.     public static function isLogged () {
    61.         return self::$logged;
    62.     }
    63.  
    64.     public static function register ($nick, $pass) {
    65.         // В этом блоке if надо проверить, нету ли уже пользователя с ником $nick
    66.         // Если есть - вернуть ошибку. Отредактируйте так, чтобы подходило под ваш код
    67.         if (Db_Get_User::byNick($nick)) {
    68.             return 'NickBusy';
    69.         } else {
    70.             // Стоит создать пользователя с таким ником в базе
    71.             $user = new Object_User();
    72.             $user->setNick($nick);
    73.             $user->setPass($pass, true);
    74.             self::$instance = Db_Put_User::create($user);
    75.             // Пользователь уже создан и в свойство класса добавлена его сущность
    76.             // Например - объект, или ассоциативный массив
    77.  
    78.             self::$logined  = true;
    79.             self::addToSession();
    80.             return true;
    81.         }
    82.     }
    83.  
    84.     public static function login ($nick, $pass) {
    85.         // Из базы надо попробовать получить пользователя с таким НикНеймом.
    86.         $user = Db_Get_User::byNick($nick);
    87.         if ($user) {
    88.             // Если такой пользователь его - сравниваем хеш пароля, который ввел
    89.             // пользователь со значением в базе
    90.             if ($user->getPass() === Make::hash($pass)) {
    91.                 // Если совпало - значит вход совершен
    92.                 self::$instance = $user;
    93.                 self::$logined  = true;
    94.                 self::addToSession();
    95.                 return true;
    96.             } else {
    97.                 return "WrongPass";
    98.             }
    99.         } else {
    100.             return "WrongNick";
    101.         }
    102.     }
    103.  
    104.     public static function logout () {
    105.         // Надо указать, что сущность пользователя теперь - гость и
    106.         // записать это значение в сессию
    107.         self::$instance = new Object_Guest;
    108.         self::$logined  = false;
    109.         self::addToSession();
    110.     }
    111.  
    112.     public static function getInstance () {
    113.         return self::$instance;
    114.     }
    115.  
    116.     private static function addToSession () {    
    117.         Session::set("User", serialize(array(
    118.             "instance" => self::$instance,
    119.             "logined" => self::$logined
    120.         )));
    121.     }
    122. }
    123.  
    124. ?>
     
  2. kostyl

    kostyl Guest

    Зачем нужны эти классы если они не работают без других. Проще самому написать.
     
  3. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    kostyl, пиши, кто ж тебе мешает то? :)
    а движок - это одна совокупная система. в данном случае надо изменить пару строчек, чтобы соединить эти классы с вашим движком. и они будут единым целым с вашим движком, а не будет создаватся впечатление, что их прилепили как что-то левое.

    Глупо вызывать функцию mysql_query в классе, если у движка есть свой класс абстракции БД, или , более того, ORM
    Глупо заставлять всех использовать чистый md5. Каждый должен использовать ту хеш-функцию, которую он хочет.
    Ну и тому подобное

    Хотя, если можешь написать что-то достойное и при этом полностью абстрагироватся от всех остальных классов - давай. будет интересно почитать.
     
  4. FiMka

    FiMka Активный пользователь

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Йээх, еще бы пример использования для таких как я :) В каком порядке кого дергать.
     
  5. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    PHP:
    1. <?
    2. User::check();
    3. if(User::isLogined()) {
    4.  echo "You are logined";
    5. } else {
    6.  printLoginForm();
    7. }
    8.  
    PHP:
    1. <?
    2. $nick = !empty($_POST['nick']) ? $_POST['nick'] : null;
    3. $pass = !empty($_POST['pass']) ? $_POST['pass'] : null;
    4. $registration = !empty($_POST['reg']) ? true : false;
    5. if ($nick and $pass) {
    6.   if($registration) {
    7.     // Если регистрация
    8.     $result = User::register($nick, $pass);
    9.     if($result === 'NickBusy') {
    10.       echo "Nickname '$nick' is busy";
    11.     } else {
    12.       header('location:/index.php?reg=true');
    13.     }
    14.   } else {
    15.     // Если вход
    16.     $result = User::login($nick, $pass);
    17.     if ($result === 'WrongNick') {
    18.       echo "There are no such nickname!";
    19.     } else if ($result === 'WrongPass') {
    20.       echo "Password is wrong!";
    21.     } else {
    22.       header('location:/index.php?login=true');
    23.     }
    24.   }
    25. } else {
    26.   echo "Nickname or password is empty!";
    27. }
    28. printLoginForm();
    29.  
    Ну это на коленке, конечно
     
  6. El Loco

    El Loco Активный пользователь

    С нами с:
    26 дек 2008
    Сообщения:
    41
    Симпатии:
    0
    Мне понравилось :)
    Последний пример хорошо иллюстрирует сам принцип работы системы.
    Мой небольшой "проектик" работает на фукциях, но принцип практически тот же. Значит я был недалеко от истины =)

    у меня дурацкий вопрос.
    вы пишите: Db_Get_User::byNick($nick)
    т.е. я понимаю, что Db_Get_User это другой класс, а byNick это метод этого класса?
    и этот класс тоже статичный?
    вопрос может показаться идиотским, но я все свое недолгое время писал функциями, а сейчас хочу понять смысл этих конструкций.
     
  7. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Для новичков код слишком сложен.
    А профессионал может написать свой.
    Но за старание плюс.
     
  8. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Elkaz, ну для новичков там и комментарии есть и понятные названия и учится на чем-то надо :) да и профессионалы друг у друга идеи могут хорошие почерпнуть. любой профессионал чего-то, да не знает. вдруг именно то, что я реализовал в одном из этих классов :))

    > Значит я был недалеко от истины =)
    Мое решение считают непоколебимой истиной: очень приятно :)

    > т.е. я понимаю, что Db_Get_User это другой класс, а byNick это метод этого класса?
    Да. Фактически, это не совсем ООП, тут скорее применился NameSpace для функций. В чем смысл? В строгой иерархии. "Db_Get_User" я ищу ENGINE_PATH/Classes/Db/Get/User.php, а там есть несколько методов: byNick, byId и т.п, которые возвращают объект, или массив объектов Object_User. Отличается от функций в первую очередь строгостью. Вот у вас, например, есть функция getUserById. Где мне, стороннему человеку, ее искать? Та даже со своим кодом я намучался, когда больше тридцати функций - уже фиг найдешь нужную. А так - есть четкое правило размещения.

    Ну и, например, в классе Db_Get_User у меня есть приватный метод by($field, $value), а остальные методы только реализуют нужное экранирование (byId - приведение к числовому типу, byCid - проверку на то, есть ли значение hex'ом и т.п.) и вызывают self::by('ID', $id). Это тоже помогает избежать дублицирования кода.

    Плюс, возможность использовать приватные свойства - тоже хороша. Можно увидеть это в статических классах User и Session выше.

    PHP:
    1. <?
    2. class Db_Get_User {
    3.     public static function byId ($id) {
    4.         if(!is_int($id)) {
    5.             trigger_error('`ID` should be int', E_USER_ERROR);
    6.             return false;
    7.         }
    8.         $users = self::by('ID', $id, 1);
    9.         return empty($users) ? null : $users[0];
    10.     }
    11.                                      
    12.     public static function byNick ($nick) {
    13.         $value = Db_Engine::escape($nick);
    14.         $users = self::by('Nick', $value, 1);
    15.         return empty($users) ? null : $users[0];
    16.     }
    17.  
    18.     public static function byRegDate ($unixTime, $limitCount = 10, $limitFrom = 0) {
    19.         if(!is_int($unixTime)) {
    20.             trigger_error('`RegDate` should be int', E_USER_ERROR);
    21.             return false;
    22.         }
    23.         return self::by('RegDate', $unixTime, $limitCount, $limitFrom);
    24.     }
    25.  
    26.     public static function byLevel ($level, $limitCount = 10, $limitFrom = 0) {
    27.         if(!is_int($level) and $level >= Object_User::GUEST and $level <= Object_User::ADMIN) {
    28.             trigger_error('`Level` should be int beetwen 1 and 4', E_USER_ERROR);
    29.             return false;
    30.         }
    31.         return self::by('Level', $level, $limitCount, $limitFrom);
    32.     }
    33.  
    34.     private static function by ($field, $value, $limitCount = 10, $limitFrom = 0) {
    35.         $limit = $limitCount ? "LIMIT $limitFrom, $limitCount" : "";
    36.  
    37.         $result = Db_Engine::select("
    38.             SELECT * FROM `Users` WHERE `$field` = '$value' $limit
    39.         ");
    40.  
    41.         $users = array();
    42.         foreach ($result as $row) {
    43.             $users[] = new Object_User($row);
    44.         }
    45.         return $users;
    46.     }
    47. }
     
  9. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Ой, простите меня дамы и господа, но я не могу удержаться:

    Что такое Logined? :)

    Во-вторых расхождения в принципе ООП.
    Почему многие члены объявлены как private?
    А если я захочу наследовать класс и дополнить его нужным функционалом?
    Приватными должны быть те члены класса, которые принадлежат только к определенному объекту и не могут быть затронуты в наследуемых, в данном же случае мне необходимо обращаться к свойству $logined (ой, не могу это слово).
     
  10. Apple, ты придираешься ))
     
  11. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Рад, что я тебя повеселил, Apple
    Вижу, ты очень хорошо разбираешься в ООП и наследовании
    Очень по-ООПешному. Я думал, что Estonia extends Country, а тут она, оказывается, наследует World

    Согласен, isLogged было бы лучше. Тем не менее, это не уменьшило читабельности и интуитивной понятности, что данный метод делает.

    Не понимаю, вообще, что тебя веселит. Смех без причины ... ?
     
  12. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Думайте.

    Мы не переходили на "ты" - это раз.
    Меня бы ничего не веселило, если бы в глаза не бросилась эта НУ ПРОСТО ДУШЕРАЗДИРАЮЩАЯ фраза:
    Знаток английского, оказывается, пишет logined (мало того, что неправильно само по себе, ибо нет такого слова, так ещё и грамматически некорректно оно введено - без удвоения суфикса n).
    Когда кто-то что-то говорит, то, соответственно, он готов это отстаивать, иначе бы, наверное, не сказал.

    Если я в чем-то сомневаюсь, я или не напишу вовсе, или сначала узнаю как надо.
    А если уже так случилось, что написал, то я с удовольствием признаю свою ошибку (если она конечно есть) и исправлю.
     
  13. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Кончаем базар
     
  14. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Разве на форуме нельзя делать замечания по коду и обсуждать его корректность?
    Даже оффтопа не было, всё по теме.
     
  15. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Самостоятельно код не работает - низачет =)
    Кстати, а зачем оборачивать обычные сессии в обертку?
     
  16. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    не указывай что мне делать. и не надо учить меня жить

    Переход на "ты" вполне допустим по правилам сетевого этикета - это раз
    Я говорю "Вы" только тому человеку, которому хочу говорить "Вы". А если человек начинает смеятся мне "в лицо" и тыкать в банальные ошибки, которые случаются у всех и мусолить эту тему вокруг одного, малозначимого слова, то я думаю, что этот человек - неадекватен. К таким я на "Вы" не обращаюсь.
    Да и фраза "А мы на вы не переходили" чаще всего звучит от девочек-подростков, которые хотят поколотить понты во время знакомства. Тебя, Apple, я на свиданку не приглашаю, потому особо напрягатся с этими выдумаными статусами "ты"-"Вы" я не собираюсь.
    Ну и сам никогда никому не делал замечание по этому поводу. Предпочитаю, чтобы ко мне говорили на "ты". Это показывает, что я не ставлю себя выше этого человека, а общаюсь с ним наравных.

    Где я указал, что знаю английский. Может я в школе французкий учил, а английский знаю только по примерам кода на php ? Укажи мне на место, где я указал, что я знаток английского?
    Или то, что я специально для того чтобы выложить на форуме код его прокомментировал на русском языке уже что-то негативное значит?

    Раз уж начал разговор - читай не через строчку.

    [vs], я в третьем посте объяснил, почему именно он не работает самостоятельно. Можно было заменить, например, абстрактное Db_Get_User::byNick($nick); на MySQL запрос, но вдруг окажется, что человек использует другую базу данных. И у него другая структура таблиц. И хеширует пароли он функцией sha256. Ну много вопросов. Потому я оставил абстрактные строчки с комментариями.

    Ну а на счет обертки - мне не нравится способ именования некоторых многих функций в пхп, ну и нужна дополнительная функциональность. Хотя тут, конечно, чисто субъективное мнение
     
  17. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Столько слов и всё впустую.
    Я указал на ошибки (в коде), вы отказались их принять и раскапризничались, словно девчонка.
    Ну что же, ваше право.
    Оффтоп окончен.
     
  18. N!k0

    N!k0 Активный пользователь

    С нами с:
    9 июн 2009
    Сообщения:
    10
    Симпатии:
    0
    Можно вопрос!? (ко всем)
    Вот смотрю на всякие вариации этой темы и везде программисты стараются сделать код с использованием сессий.
    А вот при включенной session.use_trans_sid и выключенных куках код перестает делать свое дело.
    Так в чем тогда смысл использовать session?
     
  19. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Я не понимаю людей, которые выключают куки.
    Если же они считают, что куки им не нужны, то я не имею права им перечить и искать способ из залогинить в обход. Это решение пользователя. ;)
     
  20. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    TheShock
    на аватарках могут быть только личные фотки с лицом. Терминал не канает ;)

    А смысл писать Session::set('foo', bar); если можно написать $_SESSION['foo'] = 'bar'; ? не нужно никаких лишних вызовов.

    Это так же как Шевчук дополнил свой класс работы со строками методом add (конкатенация)?
     
  21. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Класс Session совершенно не нужен, класс User обычно распадается на много классов, интерфейсов и пр.
     
  22. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Это называется абстракция. Вот надо будет тебе переписать сессии со стандартных на что-то другое. По любым причинам. Что, будешь бегать по всему коду и сторонним модулям исправлять эти присваивания?
     
  23. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    я просто сомневаюсь в том, что когда либо нужно будет переписать стандартные сессии на что-то другое.
     
  24. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    А где эти ваши правила? Чтото я не нашел на главной ссылки.
    Ну даже если так: морда у меня слишком широкая: на мини-аву 80*80 никак не влазит. Хотябы 120*120 Потому или терминал, или вообще без авы - меня вполне устроит. Или могу в качестве альтернативы выложить свои настоящие фотги в большом размере + оставить аву-терминал

    В Джава крайне не рекомендуется конкатенировать строки. Если надо добавить в конец строки еще одну строку, то делается так:
    String str = "Some str";
    str = new StringBuilder.append(str).append("something else").toString();
    Правда, это обусловленно более быстрой производительностью, но тем не менее.
     
  25. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    ну и представь цепочку вызовов:
    $str->replace('x', 'y')->split('a')->shuffle()->join('b')->add('c')->substr(5);
    а без возможность конкатенации методом пришлось бы разрывать на три строки :)
    пример, конечно, надуманный, но вполне даже ничего.

    кстати. а есть ли где-то действительно качественная обертки для массива и строк? очень хочу такую :)