За последние 24 часа нас посетили 18705 программистов и 1703 робота. Сейчас ищут 636 программистов ...

ООП для новичка

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

  1. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
    Всем привет, есть очень навязчивое чувство, что я жестко наговнокодил [​IMG]
    Прохожу видео уроки, там дается домашнее задание, я не совсем его понял, посмотрите пожалуйста.
    Само задание:
    Создайте объект класса View, удовлетворяющий следующим требованиям:
    - Конструктор не имеет аргументов
    - Есть метод assign($name, $value), чья задача - сохранить данные, передаваемые в шаблон по заданному имени (используйте защищенное свойство - массив для хранения этих данных)
    - Есть метод display($template), который отображает указанный шаблон с заранее сохраненными данными
    - * Метод render($template), который аналогичен методу display(), но не выводит шаблон с данными в браузер, а возвращает его
    Мое творение:

    Код (Text):
    1. class View {
    2. protected $array;
    3. function __construct () {
    4.  
    5. }
    6. public function assign ($name, $value) {
    7. $this->array = [$name => $value];
    8. }
    9. public function display ($template) {
    10. foreach ($this->array as $key => $value) {
    11. print $key . ' ' . $value;
    12. }
    13. }
    14. public function render ($template) {
    15. foreach ($this->array as $key => $value) {
    16. return $key . ' ' . $value;
    17. }
    18. }
    19. }
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Рааанооо вам ООП... Вы хоть задание поняли в чём состоит? Каким образом, скажите пожалуйста, вот это:
    соответствует вот этому:
    ?

    Задание простое, сделать за вас - 2 минуты, а толку для вас? 0... Вы поймите хотя бы, что от вас хотят. Чтобы вы передали сохранённые данные в существующий шаблон (иными словами, скрипт на php, не содержащий другой логики, кроме как вывод данных) и отобразили результат его работы. Там не написано отобразить имена и значения переданных переменных
    --- Добавлено ---
    Что по вашему делает эта строчка? Вы массивы не знаете, а лезете ООП учить...
     
  3. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
     
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну так если не поняли задание, спросили бы сначала смысл задания. Давайте начнём издалека. Расскажите в двух словах про работу с массивами. Затем про работу с классами. А потом - слышали ли вы вообще о разделении скрипта на логику отдельно, и шаблон вывода отдельно? И цитируйте нормально, не надо свои комментарии прямо внутри цитаты делать.
     
    kentkent7 нравится это.
  5. виталий032

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

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    PHP:
    1. <?php
    2.  
    3. class View
    4. {
    5.     protected $array;
    6.  
    7.     public function __construct()
    8.     {
    9.         $name = $this->assign('kentkent7', 12);
    10.  
    11.         $this->template = 'Имя: ' . $name . ' и его значение: ' . $this->array[$name];
    12.  
    13.         $this->display($this->template);
    14.         $this->render($this->template);
    15.      
    16.     }
    17.  
    18.     function assign($name, $value)
    19.     {
    20.         $this->array[$name] = $value;
    21.      
    22.         return $name;
    23.     }
    24.  
    25.     function display($template)
    26.     {
    27.         echo $template;
    28.     }
    29.  
    30.     function render($template)
    31.     {
    32.         return $template;
    33.     }
    34.  
    35. }
    36.  
    37. $object = new View();
    Вот так что-ли?
     
    #5 виталий032, 16 окт 2017
    Последнее редактирование: 16 окт 2017
  6. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
    Мне не у кого спрашивать :(
    Массивы - это переменные в области памяти, которые способны хранить набор данных.
    Виды: простые, двумерные, ассоциативные
    Код (Text):
    1. $array  = [1, 2, 3];
    2. $array = [[1, 2, 3
    3. ];
    4. $array = [ 1 => [1], 2 => [2], 3 => [3]];
    php - является класс ориентированным языком программирования, присутствует механизм двойного наследования, при котором потомок принимает свойства и методы класса родителя. Также можно перекрывать родительские методы, дополнять, использовать конструкторы и деструкторы, создавать объекты классов в теле сторонних классов, использовать модификаторы доступа "инкапсуляция", ну и в целом есть вся основная парадигма: наследование, инкапсуляция, полиморфизм. Класс напоминает некий массив, но в отличие от массива класс имеет методы "свойства класса".
    Слышал про PDO, где необходимо разделять логику: одна часть прием данных, другая обработка, третья вывод.
    Я извиняюсь, болею и давно на форум не заходил.
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    у вас во втором массиве скобочка загуляла с проститутками.
    --- Добавлено ---
    Это расширение для работы с базами данных
    --- Добавлено ---
    что там за бред бредов ?
     
  8. виталий032

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

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Сделал исправления. Бред остался?
     
    #8 виталий032, 16 окт 2017
    Последнее редактирование: 16 окт 2017
  9. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
    Код (Text):
    1. $array = [[1, 2, 3]
    2. ];
    Перепутал = ORM я нуб)
     
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    ловите говнософт, распродажа!!
    PHP:
    1. <?php
    2.  
    3. error_reporting ( E_ALL );
    4.  
    5. if ( version_compare ( PHP_VERSION, '7.1.0', '<' ) )
    6. {
    7.     die ( 'Error: Please, update module PHP ver ' . PHP_VERSION . ' ver < 7' );
    8. }
    9.  
    10. class View
    11. {
    12.     protected
    13.         $a = [],
    14.         $template;
    15.    
    16.     public function assign( string $name, int $value )
    17.     {
    18.         if ( isset ( $this -> a[$name] ) )
    19.             throw new Exception( sprintf ( 'Заданное имя %s уже существует', $name ) );
    20.        
    21.         $this -> a[$name] = $value;
    22.        
    23.         return $this;
    24.     }
    25.     public function template( string $s )
    26.     {
    27.         $this -> template = $s;
    28.        
    29.         return $this;
    30.     }
    31.     public function output()
    32.     {
    33.         if ( empty ( $this -> template ) )
    34.             throw new Exception( 'Шаблон не задан' );
    35.        
    36.         $string = '';
    37.        
    38.         foreach ( $this -> a AS $name => $val )
    39.         {
    40.             $string .= sprintf ( $this -> template, $name, $val ) . '<br>';
    41.         }
    42.        
    43.         return $string;
    44.     }
    45.     public function __toString()
    46.     {
    47.         return $this -> output();
    48.     }
    49. }
    50.  
    51. ( $view = new View )
    52.     -> assign( 'kentkent7', 12 )
    53.     -> assign( 'mkramer', 708 )
    54.     -> assign( 'виталий032', 15 )
    55.     -> assign( 'MouseZver', 1 )
    56.     -> template( 'Школьник %s, ему %d лет' );
    57.  
    58.  
    59.  
    60. $lalki = $view -> output();
    61. echo "ТУТ ВСЕ ЛАЛКИ:<br>{$lalki}";
    62.  
    63.  
    64. /* или */
    65.  
    66. //echo $view;
    Код (Text):
    1. ТУТ ВСЕ ЛАЛКИ:
    2. Школьник kentkent7, ему 12 лет
    3. Школьник mkramer, ему 708 лет
    4. Школьник виталий032, ему 15 лет
    5. Школьник MouseZver, ему 1 лет
    --- Добавлено ---
    Само задание убогое, 20 века или каменного едритофоба создавшего эту логику без включения современности. Телепорт чтоль заюзал хоть выродок.
     
  11. виталий032

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

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    MouseZver, можешь, пожалуйста, объяснить что это за штука:
    Код (Text):
    1. ( $view = new View )
    Это то же самое, что:
    Код (Text):
    1. $view = new View();
    2. $view->assign('...', ...);
    3. ....
    ?
     
  12. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    да, в укороченном стиле как подобие сжимания
    PHP:
    1. fputs($f=fopen('file.txt',"c+"),($a=fgets($f)-rewind($f)+1)+print$a);
    --- Добавлено ---
    зачем скобки если агрументы не передаются ?
     
  13. виталий032

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

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Я не знал, что можно без них)
     
  14. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    буш посвященным в ассасины
     
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    @MouseZver, задание, ИМХО, про другое. Смастерить View-часть от MVC - т.е. передавать переменные в скрипт.
    Почти. Но похоже.
    Это чем же?
    Круто. Сколько слов понимаете из этого?
    Вот прямо экстремальная ситуация, я решил перезаписать значение в шаблоне....
     
  16. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    итог не меняется. Передать в переменную или вывести инфу юзеру.
    прям супер пупер зашкваристая мега тру топ папка с жевачкой имба защита!
     
  17. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
    Он может хранить информацию, но я просто выражаюсь как могу))
    По своей сущности, класс является некой абстракцией реального мира.
    Пока тяжко с инкапсуляцией, я просто не пойнимаю ей применение, но точнее понимаю, что она для безопасности хранения и передачи, но вообщем все сложно)
    Я немного переработал код, я думаю не идеально, но наверное лучше.
    Код (Text):
    1. class
    2. class View {
    3.     protected $array = [];
    4.     function __construct () {
    5.        
    6.     }
    7. public function assign ($name, $value) {
    8.    $this->array[$name] = $value;
    9.     }
    10. public function render($template) {
    11.    {
    12.         $temp = file_get_contents( __DIR__ ."\\$template" );
    13.        return $temp;
    14.   }
    15.     }
    16.  
    17. public function display($template)
    18.     {
    19.         echo $this->render($template);
    20.     }
    21. }
    --- Добавлено ---
    Вообщем стараюсь эволюционировать, а что там из меня вырастет, пока и сам не знаю:)
     
  18. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну это сново не то, что от вас требуется, хотя ближе... Переменные-то в шаблон никак не подставляются. Ладно, подскажу приём конкретно метода render, раз довёл уже почти до того, что нужно:
    PHP:
    1. public function render($template) {
    2. {
    3.     ob_start();
    4.     extract($this->array);
    5.     require __DIR__ . "/$template"; // не надо виндовый разделитель использовать, в основном на никсах сайты сидят
    6.     return ob_get_clean ();
    7. }
    В принципе, традиционная такая реализация шаблоном. С вас - прочитать про все функции и инструкции, которые я использовал. Функции - просто щёлкайте в коде.
     
  19. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
    Вообщем стараюсь эволюционировать, а что там из меня вырастет, пока и сам не знаю:)
    Я тоже смотрел в сторону буфера, только думал, что данное решение неправильное))
     
  20. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну вы главное понять должны, нафига оно там надо.