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

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

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

  1. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Котерова - можно, но, там много лишнего (куча кода на C в первых главах, например) и не без ошибок в примерах. Мне недавно вот эта приглянулась: http://www.ozon.ru/context/detail/id/139127353/
    --- Добавлено ---
    И главное - именно читать всё, а не тупо набирать и запускать листинги
     
  2. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @Dimon2x я не знаю книгу котерова но могу тебе предложить вот эту тему!
    https://php.ru/forum/threads/kak-sdelat-ehto-v-bloge.67426/
    Я учился по такому материалу:
    http://php720.com/
    https://www.youtube.com/playlist?list=PLSdH7dYnlGYgrWg5wsEG4v03MiJ1WSOTx

    http://getjump.me/ru-php-the-right-way/

    И да я весь этот материалл изучал. Но я бежал по лестнице. Я достал тут всех на форуме, потому что много что не получалось! Изучал весь материал который подворачивался под руку и много читал. Читал хабр и т.д Просто статьи в интернете, что было не понятно спрашивал тут.
    Но изначально у меня уже был базис я знал что такое php что такое html и что такое js. Имел представление о клиент-серверной архитектуре. И понимал как вообще исполняется программа !
    Понимание что есть интерпретация а что компиляция тоже важные вещи! И этот весь базис нужно знать! Про ООП можешь наглядно по русски прочесть вот здесь:
    Сейчас найду ссыль на статью !
     
  3. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    К сожалению тот сайт более не доступен. Он был очень стар. Но на нём было очень хорошее описание основ и принципов ООП :(((
     
  4. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @askanim я тоже этот курс проходил, про ооп там очень мало информации
     
  5. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Упрости методы, я думаю и от имени класса ясно будет к какому классу относится данный метод.
    Напиши для сеттера set() для геттера get() для чекера check()
     
  6. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Это типа, как на первой странице?
     
  7. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    плохо смотрел, плохо читал, там нормально по ООП информации! Посмотри ещё раз не понимаешь спроси! Там всё объяснеет этот чувак! Надо не просто смотреть, а ещё и практиковать то чт опосмотрел, я каждые 5 мин ставил на паузу и практиковал.
     
  8. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    @Dimon2x Ну ты понял как тут взаимодействует это:
    PHP:
    1.  class Flash {
    2.         protected $saveSession;
    3.      
    4.         public function __construct() {
    5.             $this->saveSession = new Session();
    6.         }
    7.      
    8.         public function setMessage($id, $mess) {
    9.             $this->saveSession->setSession($id, $mess); }
    С этим:
    PHP:
    1.  public function setSession($name, $val) {
    2.             $this->name = $name;
    3.             $this->val = $val;
    4.             return $_SESSION[$this->name] = $this->val;
    5.         }
    А это:
    PHP:
    1. public function getMessage($name) {
    2.             if($this->saveSession->checkSession($name)) {
    3.                 return $this->saveSession->getSessionName($name); }
    С этим:
    PHP:
    1. public function getSessionName($name) {
    2.             return $_SESSION[$name];}
    3.  
    4. public function checkSession($name) {
    5.             if(isset($_SESSION[$name])) {
    6.                 return true;
    7.             }
    8.             return false; }
    Получая аргументы от сюда:
    PHP:
    1. $message = new Flash;
    2.     $message->setMessage('message1', 'Привет');
    3.     echo $message->getMessage('message1');
     
  9. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @keren конечно понимаю, это же мой код, по этому коду у меня непоняток не было.
     
  10. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    @Dimon2x Молодец, а то тебя че-то ругают :)
     
  11. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Я опять ни че не понял )) Какую таблицу?
     
  12. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Да там про сессии в ларавель перелестни на пару страниц назад и почитай посты )
    --- Добавлено ---
    а точней у меня встал вопрос накой нужна обёртка для сессий, когда ими и так просто пользоваться.
     
  13. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @romach, возник вопрос, почему DB-драйвер сессий в Laravel пишет в таблицу User-агента, ip и прочее. Я предположил, что защита от угона.
     
  14. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    @mkramer а хз, судя по всему это легаси с давних времен ) Остальные драйвера вроде ничего такого не собирают. Странно.

    @askanim потому что сессии в laravel далеко не всегда реализуются нативными пыховскими механизмами.
     
  15. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @romach а вообще вроде в ларе своё понятие сессий !)
     
  16. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Нет, тоже самое, только реализацию любую можно подставить, хоть полностью свою написать
     
  17. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    там типа интерфейсы?
     
  18. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Конечно. В терминах Laravel контракты. Там много чего можно на свои классы заменить. У меня в одном проекте так сделана авторизация без Eloquent
     
  19. askanim

    askanim Старожил

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

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Во всех нормальный фреймворках так. В Yii2 тоже можно свои классы вместо стандартных подставлять. Это же базовый принцип - зависеть от интерфейсов, а не от реализации.
     
  21. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @mkramer я юзал лару года два назад :D
     
  22. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Читаю Котерова, решил совместить упражнения на 435 странице и на 445, обращаюсь к create 3 раза, почему записывается только 2 лога, а не 3?

    PHP:
    1. <?php
    2.     class FileLogger {
    3.         //массив всех созданных объектов-журналов
    4.         static public $loggers = [];
    5.        
    6.         static public $f;
    7.         static public $name;
    8.         static public $lines = [];
    9.        
    10.         public function __destruct() {
    11.             $this->log('Создался объект');
    12.             fputs(self::$f, join(self::$lines));
    13.             fclose(self::$f);
    14.         }
    15.        
    16.         //открытый метод, предназначенный для создания объектов класса.
    17.         //Создать новый объект можно только с его помощью
    18.        
    19.         public static function create($name, $fname) {
    20.             //Вначале проверяем: возможно, объект для указанного имени
    21.             //файла уже существует? Тогда его и возвращаем.
    22.            
    23.            
    24.             if(isset(self::$loggers[$fname])) {
    25.            
    26.                 return self::$loggers[$fname];
    27.             }
    28.            
    29.             //А иначе создаём полностью новый объект и сохраняем ссылку
    30.             //на него в статическом массиве
    31.            
    32.             self::$name = $name;
    33.             self::$f = fopen($fname, 'a+');
    34.             self::log('Создался объект');
    35.                
    36.             return self::$loggers[$fname] = new self($fname);
    37.         }
    38.        
    39.         public static function log($str) {
    40.             $data1 = new DateTime('', new DateTimeZone('Europe/Moscow'));
    41.             $hour = $data1->format('Y-m-d H:i:s');
    42.             $prefix = '['.$hour. ' ' . self::$name . ']';
    43.             $str = preg_replace('/^/m', $prefix, rtrim($str));
    44.              self::$lines[]=$str."\r\n";
    45.         }
    46.     }
    47.    
    48.     $logger1 = FileLogger::create('test', "file.log");
    49.     $logger2 = FileLogger::create('test', "file.log");
    50.     $logger2 = FileLogger::create('test', "file.log");
    51. ?>
     
  23. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @Dimon2x, Вы логи не смотрели? Никаких нотисов нет? У Вас тут ряд недочетов.
    Во первых, класс работает совсем не так, как Вы хотите. Я так думаю, что при отсутствии 49 и 50 строчек - результат будет такой же.
    Ошибки:
    PHP:
    1. $this->log('Создался объект');// обращение к статическому методу должно быть через self::
    2. ...
    3. return self::$loggers[$fname]=new self($fname); // var_dump($logger1)  что вернет?
    P.S.: Почему ООП Вы решили начать изучать со статики? Обычно первая тема в ООП - это наследование.
     
    #148 Maputo, 3 дек 2017
    Последнее редактирование: 3 дек 2017
  24. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @Maputo В книге такая последовательность.

    Я облегчил класс. Почему мне выдаёт, только 1 элемент массива, а не от 1 до 3?

    PHP:
    1. <?php
    2.     class FileLogger {
    3.         static public $i = 1;
    4.         static public $arr = [];
    5.        
    6.         private function __construct($num) {
    7.             $this->arr[self::$i] = $num;
    8.             self::$i++;
    9.         }
    10.        
    11.         public static function create($num) {
    12.             if(isset(self::$arr[$num])) {
    13.                 return self::$arr[$num];
    14.             }
    15.            
    16.             return self::$arr[$num] = new self($num);
    17.         }
    18.        
    19.         public function getTime() {
    20.             return $this->arr;
    21.         }
    22.     }
    23.    
    24.     $ob1 = FileLogger::create('1');
    25.     $ob2 = FileLogger::create('2');
    26.     $ob3 = FileLogger::create('3');
    27.    
    28.     echo '<pre>';
    29.         print_r($ob3->getTime());
    30.     echo '</pre>';
    31. ?>
     
  25. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    PHP:
    1. $this->arr[self::$i] = $num;
    Почему к $i идет обращение через self, а к $arr через $this?