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;
}
}
  • Вопрос задан
  • 1499 просмотров
Решения вопроса 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, например.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы