Имею базовый класс вывода комментариев, и хотел бы узнать, валидный ли это код или нет. В кратком, перенесу его структуру.
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();
Корректная ли это структура построения?
Класс вы написали, и в целом это будет работать, но принципы проектирования нарушены.
Есть такие принципы называются 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 и шаблонизаторами, где велосипеды которые вы собрались писать уже реализованы за вас.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть столбик xfields, в котором присутствует подобное содержание:
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
В PHP не силён вовсеЗнаю, что вопрос решается через preg_replace, но как точно?