nmk

Лабораторна робота №16 (2 години)

Тема: Переведення логіки на Об’єктно-орієнтоване програмування (OOP). Створення найпростіших класів TaskController та UserAuth, перенесення процедурних функцій обробки у методи класів.

Мета: Ознайомитися з парадигмою об’єктно-орієнтованого програмування, інкапсуляцією логіки та поняттями “Клас”, “Об’єкт”, “Методи”. Зробити код проєкту легшим для розуміння та масштабування.

Технологічний стек: PHP OOP (class, public/private, $this, __construct()).

Завдання

  1. Ознайомитися з базовим синтаксисом створення класів у PHP.
  2. Створити клас TaskController для інкапсуляції всіх операцій над зміною та управлінням завданнями.
  3. Написати конструктор класу __construct(), який автоматично прийматиме і зберігатиме екземпляр з’єднання з БД ($pdo).
  4. Перенести SQL-запити з файлів index.php, create.php, delete.php всередину методів класу.

Хід виконання роботи

Крок 1. Створення класу Controller

У вашому проєкті створіть нову папку classes або controllers. Всередині додайте файл TaskController.php.

<?php
class TaskController {
    private $pdo; // Приватна властивість для зберігання БД підключення

    // Конструктор ініціалізує БД під час створення об'єкта
    public function __construct($pdoConnection) {
        $this->pdo = $pdoConnection;
    }
}
?>

Крок 2. Перенесення операції читання (Read)

Усередині класу створіть публічний метод getAllTasks():

public function getAllTasks() {
    $stmt = $this->pdo->query('SELECT * FROM tasks ORDER BY id DESC');
    return $stmt->fetchAll();
}

Зверніть увагу на конструкцію $this->pdo, яка необхідна для доступу до приватного збереженого екземпляру бази з поточного об’єкта.

Крок 3. Рефакторинг застосунку для роботи з ООП

Відкрийте свій index.php. Видаліть рядки отримання завдань через прямий виклик $stmt->query(), які ви писали у 12-й роботі. Натомість підключіть файл TaskController.php:

require_once 'db.php'; // отримуємо $pdo
require_once 'classes/TaskController.php';

// Створюємо екземпляр (об'єкт) класу TaskController (New Instance)
$taskController = new TaskController($pdo);

// Викликаємо публічний метод для нашої змінної $tasks:
$tasks = $taskController->getAllTasks();

HTML-шаблон нижче на цьому файлі змінювати НЕ потрібно, адже він все ще перебирає масив $tasks, як і раніше!

Крок 4. Завершення переходу (Create та Delete)

Додайте в клас публічні методи: createTask($title, $description, $priority, $userId) та deleteTask($id). Перенесіть всередину код підготовлених виразів ($stmt = $this->pdo->prepare(...) та $stmt->execute(...)) з файлів create.php та delete.php. Відкрийте файли-обробники create.php і delete.php та замініть SQL-код на виклик нових методів з об’єкта (наприклад $taskController->deleteTask($_GET['id']);).

Контрольні запитання

  1. Що таке Об’єктно-орієнтоване програмування? Основна різниця між класом (Class) і об’єктом (Object / Instance)?
  2. Назвіть 3 “кити” (принципи) ООП (І…, Н…, П…). Опишіть принцип, який ми сьогодні використовували, приховуючи підключення $pdo всередині класу і залишаючи доступними лише певні методи (напр. getAllTasks).
  3. Яке призначення конструктора класу магічного методу __construct()? Коли і ким він викликається?
  4. Для чого в ООП існує псевдо-змінна $this? Звідки в методі getAllTasks ми взяли змінні (властивості), якщо ми не передавали їх як аргументи в цей метод?
  5. Що означають модифікатори доступу public, private, protected у властивостей і методів класу? Що станеться, якщо спробувати вивести в браузер echo $taskController->pdo; в index.php?

Вимоги до звіту

  1. У lab16.md вставити повний код створеного класу TaskController.php.
  2. Показати фрагмент коду index.php (там, де ви використовуєте ключове слово new й викликаєте методи через ->).
  3. Надати відповіді на контрольні запитання.
  4. Зробити черговий commit на GitHub.