Добрый день! Подскажите пожалуйста, прохожу один онлайн курс по изучению PHP, изучаю наследование и абстрактные классы. Ниже приведено задание: Создайте абстрактный класс для хранилища Storage. Пусть данный класс содержит следующие абстрактные методы: create — создать объект в хранилище. Метод получает на вход объект, который нужно сохранить, и после сохранения возвращает уникальный идентификатор; read — получить объект из хранилища. Метод принимает на вход id или slug (любое из значений) объекта и возвращает объект; update — обновить существующий объект в хранилище. Метод принимает на вход три параметра: id или slug (любое из значений) существующего объекта и сам обновлённый объект, который нужно сохранить; delete — удалить объект из хранилища. Метод принимает на вход id или slug объекта, который нужно удалить из хранилища; list — возвращает массив всех объектов в хранилище. Создайте абстрактный класс для представления View. Этот класс должен содержать поле $storage, которому будет присвоен объект одного из дочерних классов Storage. Присвоение нужно реализовать в конструкторе, передав объект подкласса Storage в качестве параметра конструктора. Пусть класс Viewсодержит следующие абстрактные методы: displayTextById — вывести текст, принимает id в качестве параметра; displayTextByUrl — вывести текст, принимает url в качестве параметра. Создайте абстрактный класс User. Пусть данный класс содержит поля: $id — уникальный идентификатор (целое число); $name — имя; $role — название роли (автор или администратор); и абстрактный метод getTextsToEdit, который выводит список текстов, доступных пользователю для редактирования. Реализуем класс «Файл» (FileStorage) для абстрактного класса Storage. Реализуем метод create — сохраняет сериализованный объект класса TelegraphText. Имя файла должно соответствовать полю $slug (объекта класса TelegraphText) + _ + текущая дата. Если файл существует (для проверки используйте file_exists), то к имени файла добавьте _1. Если и такой файл существует — _2, и так до тех пор, пока имя файла не окажется уникальным. Перед тем, как записывать объект класса TelegraphText в файл, переопределите его поле slug в соответствии с именем файла. Для FileStorage метод create возвращает значение slug. Read — возвращает объект класса TelegraphText. Используйте slug для поиска соответствующего файла. Update — используйте slug для поиска соответствующего файла. Не забывайте сериализовать объект перед сохранением. Delete — используйте slug для поиска соответствующего файла. 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 прописать и данные в файл прописать" - т.е. что мне необходимо добавить?
1. Оформи код через </>. Сам пробовал читать то, что написал? 2. Где пояснение термина "slug", хз, что там автор курса имеет в виду.
PHP: <?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'); $slug — уникальное имя для файла, в котором будет храниться текст
На вопрос не отвечу, но замечу, что 1. "abstract class Storage" не нужен, если нет никакой реализации, нужен интерфейс; PHP: interface StorageInterface { public function create($slug); public function read($slug); public function update($slug); public function delete($slug); public function list(); } // с указанием типов параметров и возвращаемых значений 2. Если курс не по PHP 8.1 (с замечаниями об отличиях с более ранними версиями), курс не нужен. Меняй курс/препода.
Создал зачем-то абстрактный класс Storage, а в итоге пихаешь массив обычный в View. В задании же чётко всё написано --- Добавлено --- И вообще много расхождений с тем, что в задании чёрным по белому написано. В принципе, чтой-то они бредовенькое изобрели, но отдалённо на то, что должно быть, похоже. А твоя реализация - и близко не похожа