За последние 24 часа нас посетили 17764 программиста и 1698 роботов. Сейчас ищут 1696 программистов ...

Практика использование ООП

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 26 ноя 2017.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Я разобрался
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Вордпресс - это всегда плохой пример, с какой стороны не глянь. Серьезно. Начиная как раз с архитектуры, заканчивая механикой. Никогда не равняйся на вордпресс и старайся не приводить "а в вордпрессе" в качестве аргумента.
     
  3. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @Dimon2x, WordPress и Yii2 - это разные вещи. Yii2 - это только каркас сайта, на нём нельзя двумя движениями мышки поднять сайт, как в случае WordPress. Но по архитектуре да, можешь смотреть в сторону Yii2, она там не плохая.
     
    Fell-x27 нравится это.
  5. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @Dimon2x гугли лару она круче ^_^
     
  6. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Задача:

    Создайте класс Session - оболочку над сессиями. Он должен иметь следующие методы: создать переменную сессии, получить переменную, удалить переменную сессии, проверить наличие переменной сессии.

    Сессия должна стартовать (session_start) в методе __construct.

    Реализуйте класс Flash, который будет использовать внутри себя класс Session из предыдущей задачи (именно использовать, а не наследовать).

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

    Класс должен иметь да метода - setMessage, который сохраняет сообщение в сессию и getMessage, который получает сообщение из сессии.

    ---------------------------------------------------------------------------------------

    Я это сделал, всё работает, нормально ли получилось?

    PHP:
    1. <?php
    2.     error_reporting(E_ALL);
    3.    
    4.     class Session {
    5.         protected $name;
    6.         protected $val;
    7.        
    8.         public function __construct() {
    9.             session_start();
    10.         }
    11.        
    12.         public function setSession($name, $val) {
    13.             $this->name = $name;
    14.             $this->val = $val;
    15.             return $_SESSION[$this->name] = $this->val;
    16.         }
    17.        
    18.         public function getSessionName($name) {
    19.             return $_SESSION[$name];
    20.         }
    21.        
    22.         public function checkSession($name) {
    23.             if(isset($_SESSION[$name])) {
    24.                 return true;
    25.             }
    26.             return false;
    27.         }
    28.        
    29.         public function delSession($name) {
    30.              unset($_SESSION[$name]);
    31.         }
    32.     }
    33.    
    34.     class Flash {
    35.         protected $saveSession;
    36.        
    37.         public function __construct() {
    38.             $this->saveSession = new Session();
    39.         }
    40.        
    41.         public function setMessage($id, $mess) {
    42.             $this->saveSession->setSession($id, $mess);
    43.         }
    44.        
    45.         public function getMessage($name) {
    46.             if($this->saveSession->checkSession($name)) {
    47.                 return $this->saveSession->getSessionName($name);
    48.             }
    49.         }
    50.     }
    51.    
    52.     $message = new Flash;
    53.     $message->setMessage('message1', 'Привет');
    54.     echo $message->getMessage('message1');
    55.    
    56.    
    57.    
    58. ?>
     
  7. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Почитай про различие private и protected.
    --- Добавлено ---
    Если ты класс session наследовать не планируешь и хочешь закрыть свойства! Используй private! И вообще привыкай закрвать св-ва private
    а для их получения используй публичные методы.
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну классу, который оболочка над стандартным массивом $_SESSION, не нужно дополнительно хранить какие-то имена и значения - они уже хранятся в $_SESSION, так что можно сделать его без полей.
    Этот метод можно было в одну строчку сделать
    PHP:
    1. public funtion checkSession($name)
    2. {
    3.     return isset($_SESSION[$name]);
    4. }
    isset и так возвращает true или false.

    flash-сообщения, вообще, конечно, ещё удаляться из сессии после получения должны, но в твоё задании это почему-то не прописано
     
    Dimon2x нравится это.
  9. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    А нахрена писать такую обработку для сессий когда достаточно просто написать :
    PHP:
    1. if (!isset($_SESSION['name'])) {
    2.      return false;
    3. }
     
  10. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @Dimon2x, наверняка checkSession должно использоваться внутри getSessionName.
     
  11. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    а
    PHP:
    Пишешь в самом начале скрипта.
    --- Добавлено ---
    @mkramer а с другой стороны товарищ осваивает ООП ))) Я думаю каждый вначале писал глупые классы которые просто навсего нафиг не нужны :D
     
    Dimon2x нравится это.
  12. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Так?

    PHP:
    1. public function getMessage($name) {
    2.             if($this->saveSession->checkSession($name)) {
    3.                 return [
    4.                     $this->saveSession->getSessionName($name),
    5.                     $this->saveSession->delSession($name)
    6.                     ];
    7.             }
    8.         }
    9.     }
    10.    
    11.     $message = new Flash;
    12.     $message->setMessage('message1', 'Привет');
    13.     echo $message->getMessage('message1')[0];
     
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну тем не менее во всех основных фреймворках есть оболочка над сессиями. Если есть класс сессий, то его можно декорировать, его можно наследовать. Если вынести интерфейс и сделать DI-контейнер, можно какую-нибудь альтернативную работу с сессиями придумать.

    @Dimon2x, ну зачем массив возвращать?
    PHP:
    1. public function getMessage($name) {
    2.            if($this->saveSession->checkSession($name)) {
    3.                   $val = $this->saveSession->getSessionName($name);
    4.                    $this->saveSession->delSession($name);
    5.                    return val;
    6.            }
    7.        }
    8.    }
     
    Dimon2x нравится это.
  14. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @Dimon2x, это задание не решает главной проблемы сессий - имена приходится держать в голове.
     
  15. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Они же в сессии содержатся.
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Спорно. Программирую на обоих фреймворках, лара в dev-режиме тормозная до ужаса (правда, на production нормально). Необходимо тонну роутов руками писать. В Yii2 есть генератор кода, на котором примитивную админку можно сделать за 2 секунды. На Shared-хостингах сайты на yii легче поднимаются.
     
    mahmuzar нравится это.
  17. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Нахрена, Сессии нужны чисто для хранения коротких данных, если и вправду нужно хранить в кеше большой объём данных то лучше использовать redis!
     
  18. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну можно сессии сделать на redis :)
     
  19. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Ну на мой взгляд это наиболее оптимальный вариант. Либо же я хранил бы лишь id в сессии, а данные связанные с id хранил бы в базе или в файлике!
     
  20. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @Dimon2x, сделай, для удобства, чтоб можно было так сделать
    PHP:
    1. $session->getSessionName("hren", false); // если хрена в сессии нет, чтоб возвращало по дефолту false или что-то ещё
     
    Dimon2x нравится это.
  21. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Всё зависит от задачи. Я вот например сейчас делаю в своём движке модуль магазина связанного с моими каталогами, я планирую данные от покупателей держать в файлах json а имя файла держать в сессии и куке :)
    --- Добавлено ---
    А вот библу для полученя данных из json по id сессии я планирую писать :)
    а когда я в первые помню писал магазин, я хранил все данные корзины в $_SESSION :)
    --- Добавлено ---
    Просто если будет простенький хост, то хранить данные в сессии, от каждого посетителя, это может кончится плачевно :)
     
  22. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
  23. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Жесть
    PHP:
    1. $table->string('ip_address', 45)->nullable();
    2.     $table->text('user_agent')->nullable();
    3.     $table->text('payload');
    @mkramer обёртка ради обёртки... Какое - то не целесообразное растрачивание ресурсов! :)
    Поэтому я юзаю лишь micro frameworks )
    PHP:
    1. function GetIP() {
    2.   if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    3.     $ip = $_SERVER['HTTP_CLIENT_IP'];
    4.   } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    5.     $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    6.   } else {
    7.     $ip = $_SERVER['REMOTE_ADDR'];
    8.   }
    9.   return $ip;
    10. }
    наткнулся на певрый попавшийся скрипт,
    а вот и user agent
    PHP:
    1. echo $_SERVER["HTTP_USER_AGENT"];
    Нахрена это держать в супер глобальном массиве сессий, когда они и так существуют в супер глобальном массиве $_SERVER
    --- Добавлено ---
    Просто зачем, просто нафига? Нафига лишний код ? Это чиста выделится мне кажится мб для разрабов которые не знают пых это надо и сели кодить начиная с лары.
    --- Добавлено ---
    Это как в битриксе... У них наверное лозунг компании: "Мы не юзаем уже готовые и общеизвестные стандарты, мы создаём свои!";
    Мы создадим своё понятие пространства имён! Нахрена нам юзать стандарт psr-4 У нас есть свой bitrix-4. Госпади... Это как нафига нам сервера на ubuntu, debian, freeBSD мы создадим свой линукс BITRIX VM! Вот тут тоже самое. Вопрос а на...я ?
     
  24. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Не ради обёртки. Я могу задекорировать и поставить дополнительную обработку данных (не знаю зачем, но могу), флеш-данные автоматически удаляются при получении и прочее и прочее. Привязка к юзер-агенту - это встроенная в Laravel защита от угона сессии.
     
  25. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Я походу чё то не знаю. Я как бы знаю что такое flash, но в каком плане используется этот термин?
    --- Добавлено ---
    Прикольно защита по угону сессии хранится в самой сессии?
    --- Добавлено ---
    Как можно угнать сессию? Забраться в браузер и стырить его куки?
    --- Добавлено ---
    Вроде как современные браузеры поддерживают защиту куков. Вроде слышал об этом.
    --- Добавлено ---
    геолокация ещё можно так привязать. Но это всё такое эти данные хранить в сессии ? Не я буду хранить их лучше в бд, и буду сверять эти данные дёргая по id сессии из бд с самим браузером клиента! А user agent может быть одинаковый?
    --- Добавлено ---
    или там к наименованию браузера дописываются ещё какие тот определённые цифорки(символы) ?