PHP составление класса

197
07 февраля 2018, 14:13

Имею базовый класс вывода комментариев, и хотел бы узнать, валидный ли это код или нет. В кратком, перенесу его структуру.

class Comments {
public $data;
function get() {
 return $this->data = $db->getAll("SELECT * FROM comments");
}
function show() {
 for($i = 0; $i < count($this->data) $i++) {
  $result .= '<div class"comment">'.$this->data[$i]['text'].'</div>
}
}

В месте вывода я делаю:

$comments = new Comments;
$comments->get();
$content = $comments->show();

Корректная ли это структура построения?

Answer 1

Правильная ли архитектура с точки зрения ООП? - Безусловно нет.

Класс вы написали, и в целом это будет работать, но принципы проектирования нарушены.

Есть такие принципы называются SOLID, так вот в соответствии с ними нужно привести архитектуру в порядок. Один принципов вы безусловно нарушили.

Принцип единственной обязанности

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

Если рассматривать даже минимальные требования к архитектуре, то у вас класс занимается двумя вещами - это получение данных из хранилища и вывод данных, а еще обращается к глобальной переменной.

Также, c точки зрения качества кода, у вас модификаторы не объявлены для функций, для data вообще стоит публичный модификатор доступа, что позволяет мне внести в него изменения о которых можно забыть и долго искать. В данном случае, хорошо бы чтобы такие свойства были закрыты для получения и изменения извне без соответствующих методов.

Рефакторинг

Пишем абстрактный класс для DAO

abstract class Dao 
{
   protected $db;
   public function __construct(YourDatabaseAbstractClass $db) 
   {
      $this->db = $db;
   }
   public function setDb(YourDatabaseAbstractClass $db) 
   {
     $this->db = $db;
   }
   public function getDb() 
   {
      return $this->db;
   }
}

Пишем класс для работы с получением данных на основе абстрактного класса:

class ComentsDao extends Dao {
    public function getAll() : array
    {
         return $db->getAll("SELECT * FROM comments");
    }
}

Пишем интерфейс для HTML сущности:

interface HtmlElement {
    public function getHtml();
}

Пишем класс на основе интерфейса:

class CommentElement implements HtmlElement {
     protected $data;
     public function __construct(array $data) 
     {
          $this->data = $data;
     }
     public function getHtml() 
     {
          $result = '';
          for ($i = 0; $i < count($this->data); $i++) 
          {
            $result .= '<div class"comment">'.$this->data[$i]['text'].'</div>';
          }
          return $result;
     }
}

Это один из простых способов рефакторинга, в идеале из DAO должен возвращаться массив обьектов Comment, который должен быть заранее определен. Передача ассоциативных массивов в функции в подобном решении - не лучший выход.

А если проще, то воспользуйтесь ORM и шаблонизаторами, где велосипеды которые вы собрались писать уже реализованы за вас.

READ ALSO
Как обновить информация в столбце в mysql?

Как обновить информация в столбце в mysql?

Есть столбик xfields, в котором присутствует подобное содержание:

206
Не работают псевдонмы

Не работают псевдонмы

Не понимаю, почему этот алиас работает

159
PHP. Send file to endpoint as binary data [требует правки]

PHP. Send file to endpoint as binary data [требует правки]

In the example below, the file is sent as a stringIs it possible to send a file as a binary data via Guzzle? I mean, send the file as is, without reading

186
PHP - Как удалить весь код, кроме &lt;table&gt;…&lt;/table&gt;?

PHP - Как удалить весь код, кроме <table>…</table>?

В PHP не силён вовсеЗнаю, что вопрос решается через preg_replace, но как точно?

207