Код в парадигме ООП PHP?

Напишите код в парадигме ООП, соответствующий следующей структуре. Сущности: Пользователь, Статья. Связи: Один пользователь может написать несколько статей. У каждой статьи может быть только один пользователь-автор. Функциональность: возможность для пользователя создать новую статью; возможность получить автора статьи; возможность получить все статьи конкретного пользователя; возможность сменить автора статьи. Если вы применили какие-либо паттерны при написании, укажите какие и с какой целью. Код, реализующий конкретную функциональность, не требуется, только общая структура классов и методов. Код должен быть прокомментирован в стиле PHPDoc.

У меня вышло как-то так. Только сильно не бейте, сам понимаю, что это ад. Но хоть скажите, это хоть немного похоже на задание или вообще мимо?

<?
//  Класс пользователя
class user {
    
    // данные (свойства):
    var $name; // имя пользователя
    var $id; // id пользователя
    
    // Конструктор, в котором по $id загружаются данные пользователя 
    // например $this->name
    function user($id) {
        // т.к. было сказано код функционала не писать, сделаю так...
        $this->name = 'test';   // Тут вынимаем из базы имя
        $this->id = $id;
    }
 
 
    // создаю новую статью с user_id = $this->id
    function creat_article() {
        $article = new Article($this->id);
    }
    
    
    // получить все статьи конкретного пользователя
    function creat_article() {
        $article = new Article; // Создаю без id, чтоб получился "пустой" объект
        $article->find_by_user($this->id); // а тут выбираю все статью данного user-а
    }
}
 
 
// А вот и класс самой статьи
class Article() {
    
    // данные (свойства):
    var $user_id; // имя пользователя
    var $array_of_article = array(); // Тут буду сидеть все статьи...
    
    // Конструктор
    function Article($user_id == nuul) {
        // Если в конструктор отправлен id то сразу нахожу его...
        if ($user_id) {
            $this->user_id = $user_id;
        }
    }
    
    function find_by_user($user_id == nuul) {
        // ищу все статьи данного пользователя...
        if ($user_id) {
            $this->user_id = $user_id;
        }
        
        // Делаю проверку т.к. объект может быть создан без id и в данный метод он может быть не отправлен...
        if ($this->user_id) {
            // В какой-нибудь массив складываю статьи....
            $this->array_of_article[] = ''; // Вынимаю из базы статью и кладу в массив....
        }  
    }
    
    
    function change_user($new_user_id == nuul) {
        if ($new_user_id) {
            $this->user_id = $new_user_id;
            // И сразу исскуственно вызываю конструктор
            Article($new_user_id)
        }
    }    
    
    
    
}
  • Вопрос задан
  • 1966 просмотров
Решения вопроса 3
makarenya
@makarenya
программист
Вы сконцентрировались на попытке сделать ваше решение БД-ориентированным, в то время как вас не просили этого делать. Из за БД-ориентированности в вашем коде происходят странные вещи, можно сказать "магия". Некоторые вещи вообще странные, вроде списка статей внутри статьи.
Вас просили сделать описания классов, методов и свойств класса в формате PhpDoc, а вы этого не сделали.

Попробуйте ещё раз, но со следующими ограничениями:
  • В классе User оставьте только свойство $name и свойство $articlesList = [] - который будет уже списком статей, которые написал автор. Пусть список храниться внутри объекта пользователя, в ORM типа Doctrine так и происходит. Уберите оттуда $id.
  • Не забудьте добавить методы getName() и setName($newName) для работы со свойством name. Это является правильным для ООП - не позволять клиентам класса работать со свойствами напрямую, а лишь вызывая методы, которые вы предоставляете. Причина проста - в методе вы можете указать какое-нибудь дополнительное поведение, которое требуется при изменении свойства.
  • Также придумайте методы, необходимые для работы со списком статей. Ну вот два уже напрашивается из задания: "возможность для автора создать новую статью" и "возможность получить все статьи конкретного пользователя". Но по хорошему статью ещё и удалить можно...
  • Для статьи вам понадобятся 2 поля - это ссылка на автора (то есть сам объект класса User, а не магический id). То есть $author, и ещё, раз это статья, то ей неплохо бы добавить свойство $text.
  • А теперь главное - не пишите вообще текста методов. Только открыли фигурные скобки и сразу закройте на следующей строке. От вас этого не просили. И даже явно указали этого не делать!


Если всё ещё сомневаетесь, то советую почитать обучалку по Doctrine. Там они постепенно создают совершенно коректные с точки зрения ООП классы User и Bug. (они это делают последовательно, так что не поленитесь докрутить до самого конца обучалки)
Ответ написан
27cm
@27cm
TODO: Написать статус
Вообще мимо.

Для начала надо сделать код рабочим. Некоторые вещи вроде class Article() { ... } и function find_by_user($user_id == nuul) написаны с ошибками.

Потом читаем про конструкторы, про private/protected/public, забываем про var.
Ответ написан
Комментировать
try {
    $db_connection = new DbConnection();
    $user_repository = new UserDbRepository($db_connection);
    $owner = $user_repository->findById($user_id);
    if (!$owner) {
        throw new UserNotFoundException("Автор с идентификатором \"{$user_id}\" не найден");
    }
    $article_repository = new ArticleDbRepository($db_connection);
    $articles = $article_repository->findByOwnerId($owner->id);

} catch(UserNotFoundException $e) {
    // ...
} catch(\Exception $e) {
    // ...
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы