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

    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) {
        // ...
    }
    Ответ написан
    Комментировать
  • Код в парадигме ООП PHP?

    makarenya
    @makarenya
    программист
    Вы сконцентрировались на попытке сделать ваше решение БД-ориентированным, в то время как вас не просили этого делать. Из за БД-ориентированности в вашем коде происходят странные вещи, можно сказать "магия". Некоторые вещи вообще странные, вроде списка статей внутри статьи.
    Вас просили сделать описания классов, методов и свойств класса в формате PhpDoc, а вы этого не сделали.

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


    Если всё ещё сомневаетесь, то советую почитать обучалку по Doctrine. Там они постепенно создают совершенно коректные с точки зрения ООП классы User и Bug. (они это делают последовательно, так что не поленитесь докрутить до самого конца обучалки)
    Ответ написан
    2 комментария
  • Рефакторинг кода и исправление багов?

    usdglander
    @usdglander Куратор тега PHP
    Yipee-ki-yay
    function load_users_data(Array $user_ids) 
    {
        $data = [];
        
        $user_ids = array_filter($user_ids, function($id) { 
            return is_numeric($id); 
        });
        
        if ($db = mysqli_connect("localhost", "root", "123123", "database")) {
            $sql = "SELECT * FROM `users` WHERE id IN (" . implode(',', $user_ids) . ")";
            $query = mysqli_query($db, $sql);
        
            while($obj = $query->fetch_object()) {
                $data[$obj->id] = $obj->name;
            }
    
            mysqli_close($db);
        } else {
            throw new Exception('Ошибка соединения с базой данных.');
        }
        return $data;
    }
    
    $data = load_users_data(explode(',', $_GET['user_ids']));
    foreach ($data as $user_id=>$name) {
        echo "<a href=\"/show_user.php?id=$user_id\">$name</a>";
    }

    В самом первом приближении лучше сделать вот так
    Ответ написан
    5 комментариев