Советы по улучшению кода

369
11 апреля 2017, 12:34

Годен ли такой код вывода? Как его улучшить?

<?php
header('Content-Type: text/html; charset=utf-8');
error_reporting(-1);
class News{
    private $title;
    private $date;
    private $author;
    private $description;
    public function setTitle($title){
        $this->title = $title;
    }
    public function getTitle(){
        return $this->title;
    }
    public function setDate($date){
        $this->date = $date;
    }
    public function getDate(){
        return $this->date;
    }
    public function setAuthor($author){
        $this->author = $author;
    }
    public function getAuthor(){
        return $this->author;
    }
    public function setDescription($description){
        $this->description = $description;
    }
    public function getDescription(){
        return $this->description;
    }
    public function getJson($fileName){
        $json = file_get_contents($fileName);
        $data = json_decode($json, true);
        $news = new News();
        $news->setTitle($data['news']['title']);
        $news->setDate($data['news']['date']);
        $news->setAuthor($data['news']['author']);
        $news->setDescription($data['news']['description']);
        return $news;
    }
}
$catalog = scandir(__DIR__ . '/article');
?>
<!DOCTYPE html>
<html>
    <head>
        <title>Новости сайта</title>
        <link rel="stylesheet" href="./style.css">
    </head>
<body>
    <div class="content">
        <h2>Последние новости</h2>
        <?php
            $ob1 = new News();
            foreach($catalog as $file){
                if(pathinfo($file, PATHINFO_EXTENSION) == 'json'){
                    $json = $ob1->getJson('article/' .$file);
                    echo '<div class="news">';
                        echo '<div class="title">';
                            echo $json->getTitle(); 
                        echo '</div>';
                        echo '<div class="description">';
                            echo $json->getDescription(); 
                        echo '</div>';
                        echo '<div class="date inline-block"><span>Дата:</span>';
                            echo $json->getDate(); 
                        echo '</div>';
                        echo '<span> | </span>';
                        echo '<div class="author inline-block"><span>Добавил:</span>';
                            echo $json->getAuthor(); 
                        echo '</div>';
                    echo '</div>';
                }
            }   
        ?>
    </div>
</body>
</html>
Answer 1

Перебор json файлов можно сделать через DirectoryIterator:

$files = new RegexIterator(new DirectoryIterator($path), '/\.json$/i');
foreach ($files as $file) {
   $news = News::fromJson($file->getFileName());
   echo $news->renderHtml();
}

Сам класс можно сделать попроще:

class News {
  protected $title, $description, $author, $date;
  public function __construct($title, $description, $author, $date) {
    $this->title = $title;
    $this->description = $description;
    $this->author = $author;
    $this->date = $date;
  }
  public static function fromJson($filename) {
    $data = json_decode(file_get_contents($filename));
    $news = $data['news'];
    $obj = new self($news['title'], $news['description'], $news['author'], $news['date']);
  }
  public function renderHtml() { // Рендер c HEREDOC
     $title = htmlspecialchars($this->title);
     $author = htmlspecialchars($this->author);
     $description = htmlspecialchars($this->description);
     $date = htmlspecialchars($this->date);
     return <<<HTML
<div class="news">
  <div class="title">
    $title
  </div>
  <div class="description">
    $description
  </div>
  <div class="date inline-block">
    <span>$date</span>
  </div>
  <div class="author inline-block">
    <span>Добавил: </span> $author
  </div>
</div>
HTML;
  }
}

Впоследствии, метод render лучше переделать на использование какого-нибудь шаблонизатора, навроде Twig..

  1. Если метод объекта не нуждается в самом объекте - он должен быть статическим.
  2. getX/setX методы лучше не заводить лишь бы были. Можно объявить свойства public, а когда понадобится, менять их логику в __get/__set.
  3. Все данные при отображении в html должны быть экранированы(htmlspecialchars)
  4. Все необходимые для создания объекта данные нужно передавать в конструктор, чтобы исключить существование объекта в неконсистентном состоянии.
READ ALSO
Как сравнить даты в формате String

Как сравнить даты в формате String

Здравстуйте, у меня есть дата в формате String, как мне определить, что прошло уже больше 4х секунд?

333
Помогите изменить парсер

Помогите изменить парсер

Есть код , который парсит текст и ссылки с определенного адреса

305
ESelect2 дублирует данные при отправке формы

ESelect2 дублирует данные при отправке формы

Добрый день! Использую в проекте расширение anggiaj/ESelect2 для множественного выбора значений, и при отправке формы отправляемые данные дублируютсяТочнее,...

312