g_hagmt
@g_hagmt
Начинающий веб-разработчик

Нужен ли класс в этом случае? Или можно держать функцию особняком?

Стал изучать концепцию MVC. Чтобы понять суть, стал смотреть видео-уроки по созданию сайта с MVC в основе. В уроке чел использует класс для контроллера, и класс для модели (код ниже). Так вот, если я еще как-то могу понять класс контроллера, то класс модели... вообще не понимаю, зачем он нужен, ведь там описан статический метод. Почему не держать просто набор функций отдельно, без класса? Я чего-то не понимаю, или это странности разработчика из урока?
include_once ROOT. '/models/News.php';

class NewsController {
	public function actionIndex()
	{
		$newsList = array();
		$newsList = News::getNewsList();

		require_once(ROOT . '/views/news/index.php');

		return true;
	}

	public function actionView($id)
	{
		if ($id) {
			$newsItem = News::getNewsItemByID($id);
	require_once(ROOT . '/views/news/view.php');
		}

		return true;
	}
}


class News
{
	public static function getNewsItemByID($id)
	{
		$id = intval($id);

		if ($id) {
			$db = Db::getConnection();
			$result = $db->query('SELECT * FROM news WHERE id=' . $id);

			$result->setFetchMode(PDO::FETCH_ASSOC);

			$newsItem = $result->fetch();

			return $newsItem;
		}
	}

	public static function getNewsList() {
		$db = Db::getConnection();
		$newsList = array();

		$result = $db->query('SELECT id, title, date, author_name, short_content FROM news ORDER BY id ASC LIMIT 10');

		$i = 0;
		while($row = $result->fetch()) {
			$newsList[$i]['id'] = $row['id'];
			$newsList[$i]['title'] = $row['title'];
			$newsList[$i]['date'] = $row['date'];
			$newsList[$i]['author_name'] = $row['author_name'];
			$newsList[$i]['short_content'] = $row['short_content'];
			$i++;
		}

		return $newsList;
}
}
  • Вопрос задан
  • 1498 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Это проблема упрощения.
Реальный код трудно понять, поскольку он учитывает множество нюансов, важных в реальной жизни.
поэтому в обучающих материалах код упрощают, так что начинает казаться что без классов будет даже проще.

Кроме того, авторы видеокурсов в большинстве своем - неграмотные имбецилы, которые с трудом понимают код, который пишут. Кроме шуток. Пример. Вот так пишут обезьяны:
$i = 0;
    $newsList = array();
    while($row = $result->fetch()) {
      $newsList[$i]['id'] = $row['id'];
      $newsList[$i]['title'] = $row['title'];
      $newsList[$i]['date'] = $row['date'];
      $newsList[$i]['author_name'] = $row['author_name'];
      $newsList[$i]['short_content'] = $row['short_content'];
      $i++;
    }
    return $newsList;

Реально, макаки.
Этот гамадрил где-то сам увидел обучающий материал из 1990-х годов прошлого века, запомнил его, и теперь лепит уже в свои "обучающие ведидео".
при том что если бы он понимал смысл этого кода, то написал бы просто
$newsList = array();
    while($row = $result->fetch()) {
      $newsList[] = $row;
    }
    return $newsList;

Поскольку $row уже содержит все нужные данные и переливать их из пустого в порожнее не нужно.
А если бы наш бабуин хотя бы раз в жизни поинтересовался инструментами, которые он использует, то написал бы и вовсе одну строчку,

return $result->fetchAll();

Поскольку все уже написано до нас - надо только руку протянуть и использовать готовое.

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

Если вернуться к теме "отдельные функции или класс", то для примера приведенного здесь класс, действительно, не нужен. Любая коллекция статических методов может быть заменена на набор функций.

В нормальной же модели класс нужен, поскольку в ней будут использоваться переменные класса, например соединение с БД. Таким образом его можно будет передать в конструктор один раз и не писать соединение в каждом методе.
Также в модели удобно прописать имя таблицы. Тогда множество методов можно будет унаследовать от единого прототипа. например

abstract class Model {
    protected $table;
    protected $db;
    public function __construct($db) {
         $this->db = $db;
    }
    public function find($id) {
        $sql = "SELECT * FROM `$this->table` WHERE id=?";
        $stmt = $this->db->prepare($sql);
        $stmt->execute([$id]);
        return $stmt->fetch();
    }
}
class News extends Model {
        protected $table = 'news';
}
$news = new News($db);
$article = $news->find($id);


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

Если хочется нормальных обучающих материалов, рекомендую канал Дмитрия Елисеева, https://www.youtube.com/user/ElisDN/videos
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
hack504
@hack504
Моделью в данном случае должна выступать ORM, а автор просто сделал жалкое подобие для наглядности (видимо в следующих уроках разжует это).
Судя по всему тут всё для наглядности - во View эта модель не прокидывается никак, вьюшка тупо в её области видимости инклудится. Для примера ОК, можешь попутно трогать Yii2, например.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
25 апр. 2024, в 11:20
1000 руб./за проект
25 апр. 2024, в 11:02
5000 руб./за проект
25 апр. 2024, в 10:42
150000 руб./за проект