За последние 24 часа нас посетили 70493 программиста и 6420 роботов. Сейчас ищут 1575 программистов ...

Наследование и абстрактные классы

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

  1. cyberdown

    cyberdown Новичок

    С нами с:
    4 июн 2022
    Сообщения:
    3
    Симпатии:
    0
    Добрый день! Подскажите пожалуйста, прохожу один онлайн курс по изучению PHP, изучаю наследование и абстрактные классы. Ниже приведено задание:

    1. Создайте абстрактный класс для хранилища Storage. Пусть данный класс содержит следующие абстрактные методы:
      • create — создать объект в хранилище. Метод получает на вход объект, который нужно сохранить, и после сохранения возвращает уникальный идентификатор;
      • read — получить объект из хранилища. Метод принимает на вход id или slug (любое из значений) объекта и возвращает объект;
      • update — обновить существующий объект в хранилище. Метод принимает на вход три параметра: id или slug (любое из значений) существующего объекта и сам обновлённый объект, который нужно сохранить;
      • delete — удалить объект из хранилища. Метод принимает на вход id или slug объекта, который нужно удалить из хранилища;
      • list — возвращает массив всех объектов в хранилище.
    2. Создайте абстрактный класс для представления View. Этот класс должен содержать поле $storage, которому будет присвоен объект одного из дочерних классов Storage. Присвоение нужно реализовать в конструкторе, передав объект подкласса Storage в качестве параметра конструктора.
      Пусть класс Viewсодержит следующие абстрактные методы:
      • displayTextById — вывести текст, принимает id в качестве параметра;
      • displayTextByUrl — вывести текст, принимает url в качестве параметра.
    3. Создайте абстрактный класс User. Пусть данный класс содержит поля:
      • $id — уникальный идентификатор (целое число);
      • $name — имя;
      • $role — название роли (автор или администратор);
      • и абстрактный метод getTextsToEdit, который выводит список текстов, доступных пользователю для редактирования.
    4. Реализуем класс «Файл» (FileStorage) для абстрактного класса Storage.
    5. Реализуем метод create — сохраняет сериализованный объект класса TelegraphText. Имя файла должно соответствовать полю $slug (объекта класса TelegraphText) + _ + текущая дата. Если файл существует (для проверки используйте file_exists), то к имени файла добавьте _1. Если и такой файл существует — _2, и так до тех пор, пока имя файла не окажется уникальным. Перед тем, как записывать объект класса TelegraphText в файл, переопределите его поле slug в соответствии с именем файла. Для FileStorage метод create возвращает значение slug.
    6. Read — возвращает объект класса TelegraphText. Используйте slug для поиска соответствующего файла.
    7. Update — используйте slug для поиска соответствующего файла. Не забывайте сериализовать объект перед сохранением.
    8. Delete — используйте slug для поиска соответствующего файла.
    9. List — получите список файлов в директории, извлеките из них объекты класса TelegraphText (с помощью десериализации) и положите в массив. Метод list возвращает массив объектов класса Text. Для сканирования директории используйте встроенную функцию scandir.
    Теперь сам код, который я сделал:

    <?php

    abstract class Storage
    {
    abstract function create($slug);
    abstract function read($slug);
    abstract function update($slug);
    abstract function delete($slug);
    abstract function list();
    }

    abstract class View
    {
    public function __construct()
    {
    $this->storage = [];
    }

    abstract function displayTextById($id);
    abstract function displayTextByUrl($url);
    }

    abstract class User
    {
    public $id;
    public $name;
    public $role;
    abstract function getTextsToEdit();
    }

    class FileStorage extends Storage
    {
    public $directory = 'D:\SOFTWARE\xampp\htdocs\welcome';

    public function create($slug)
    {
    $i = 1;
    $this->slug .= '_' . date("F j, Y, g:i a");
    if (file_exists($this->slug)) {
    while (file_exists($this->slug . '_' . $i)) {
    $i++;
    }
    $this->slug .= '_' . $i;
    }
    return $this->slug;
    }

    public function read($slug)
    {
    $this->slug = unserialize(file_get_contents($this->slug));
    }

    public function update($slug)
    {
    $this->slug = unserialize(file_get_contents($this->slug));
    }

    public function delete($slug)
    {
    $this->slug = unserialize(file_get_contents($this->slug));
    }

    public function list()
    {
    $search = scandir($this->directory);
    }
    }


    class TelegraphText
    {
    public $text;
    public $title;
    public $author;
    public $published;
    public $slug;

    public function __construct($author, $slug)
    {
    $this->author = 'Сидоров И.С.';
    $this->slug = 'Заголовок';
    $this->published = date("F j, Y, g:i a");
    }

    public function storeText($text, $title, $author, $published)
    {
    $textArray = ['text' => $text, 'title' => $title, 'author' => $author, 'published' => $published];
    $this->slug = file_put_contents('readme.txt', serialize($textArray));

    }

    public function loadText($slug)
    {
    if (file_exists($slug)) {
    $data = unserialize(file_get_contents($slug));
    $this->text = $data['text'];
    $this->title = $data['title'];
    $this->author = $data['author'];
    $this->published = $data['published'];
    print_r($data);
    }
    }

    public function editText($text, $title)
    {
    $this->text = $text;
    $this->title = $title;
    }
    }




    $telegraph = new TelegraphText('Сидоров И.С.', 'Дубровский.txt');
    $telegraph->editText('Измененный текст', 'Измененный заголовок');
    $telegraph->storeText('Текст_1', 'Заголовок_1', 'И.И. Иванов', date("F j, Y, g:i a"));
    $telegraph->loadText('readme.txt');

    При проверке преподаватель указал, что задание не полностью выполнено и чтобы обратил внимание на метод create. "Там надо еще и slug прописать и данные в файл прописать" - т.е. что мне необходимо добавить?
     
  2. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    947
    Симпатии:
    147
    1. Оформи код через </>. Сам пробовал читать то, что написал?
    2. Где пояснение термина "slug", хз, что там автор курса имеет в виду.
     
  3. cyberdown

    cyberdown Новичок

    С нами с:
    4 июн 2022
    Сообщения:
    3
    Симпатии:
    0
    PHP:
    1. <?php
    2.  
    3. abstract class Storage
    4. {
    5.     abstract function create($slug);
    6.     abstract function read($slug);
    7.     abstract function update($slug);
    8.     abstract function delete($slug);
    9.     abstract function list();
    10. }
    11.  
    12. abstract class View
    13. {
    14.     public function __construct()
    15.     {
    16.         $this->storage = [];
    17.     }
    18.  
    19.     abstract function displayTextById($id);
    20.     abstract function displayTextByUrl($url);
    21. }
    22.  
    23. abstract class User
    24. {
    25.     public $id;
    26.     public $name;
    27.     public $role;
    28.     abstract function getTextsToEdit();
    29. }
    30.  
    31. class FileStorage extends Storage
    32. {
    33.     public $directory = 'D:\SOFTWARE\xampp\htdocs\welcome';
    34.  
    35.     public function create($slug)
    36.     {
    37.         $i = 1;
    38.         $this->slug .= '_' . date("F j, Y, g:i a");
    39.         if (file_exists($this->slug)) {
    40.             while (file_exists($this->slug . '_' . $i)) {
    41.                 $i++;
    42.             }
    43.             $this->slug .= '_' . $i;
    44.         }
    45.         return $this->slug;
    46.     }
    47.  
    48.     public function read($slug)
    49.     {
    50.         $this->slug = unserialize(file_get_contents($this->slug));
    51.     }
    52.  
    53.     public function update($slug)
    54.     {
    55.         $this->slug = unserialize(file_get_contents($this->slug));
    56.     }
    57.  
    58.     public function delete($slug)
    59.     {
    60.         $this->slug = unserialize(file_get_contents($this->slug));
    61.     }
    62.  
    63.     public function list()
    64.     {
    65.         $search = scandir($this->directory);
    66.     }
    67. }
    68.  
    69.  
    70. class TelegraphText
    71. {
    72.     public $text;
    73.     public $title;
    74.     public $author;
    75.     public $published;
    76.     public $slug;
    77.  
    78.     public function __construct($author, $slug)
    79.     {
    80.         $this->author = 'Сидоров И.С.';
    81.         $this->slug = 'Заголовок';
    82.         $this->published =  date("F j, Y, g:i a");
    83.     }
    84.  
    85.     public function storeText($text, $title, $author, $published)
    86.     {
    87.         $textArray = ['text' => $text, 'title' => $title, 'author' => $author, 'published' => $published];
    88.         $this->slug = file_put_contents('readme.txt', serialize($textArray));
    89.  
    90.     }
    91.  
    92.     public function loadText($slug)
    93.     {
    94.         if (file_exists($slug)) {
    95.             $data = unserialize(file_get_contents($slug));
    96.             $this->text = $data['text'];
    97.             $this->title = $data['title'];
    98.             $this->author = $data['author'];
    99.             $this->published = $data['published'];
    100.             print_r($data);
    101.         }
    102.     }
    103.  
    104.     public function editText($text, $title)
    105.     {
    106.         $this->text = $text;
    107.         $this->title = $title;
    108.     }
    109. }
    110.  
    111.  
    112.  
    113.  
    114. $telegraph = new TelegraphText('Сидоров И.С.', 'Дубровский.txt');
    115. $telegraph->editText('Измененный текст', 'Измененный заголовок');
    116. $telegraph->storeText('Текст_1', 'Заголовок_1', 'И.И. Иванов', date("F j, Y, g:i a"));
    117. $telegraph->loadText('readme.txt');
    $slug — уникальное имя для файла, в котором будет храниться текст
     
  4. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    947
    Симпатии:
    147
    На вопрос не отвечу, но замечу, что
    1. "abstract class Storage" не нужен, если нет никакой реализации, нужен интерфейс;
    PHP:
    1. interface StorageInterface
    2. {
    3.     public function create($slug);
    4.     public function read($slug);
    5.     public function update($slug);
    6.     public function delete($slug);
    7.     public function list();
    8. }
    9. // с указанием типов параметров и возвращаемых значений
    2. Если курс не по PHP 8.1 (с замечаниями об отличиях с более ранними версиями), курс не нужен.
    Меняй курс/препода.
     
  5. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Создал зачем-то абстрактный класс Storage, а в итоге пихаешь массив обычный в View.

    В задании же чётко всё написано
    --- Добавлено ---
    И вообще много расхождений с тем, что в задании чёрным по белому написано. В принципе, чтой-то они бредовенькое изобрели, но отдалённо на то, что должно быть, похоже. А твоя реализация - и близко не похожа