Уроки курса
1 Основы синтаксиса PHP 8
60 мин
2 Функции и управляющие конструкции
60 мин
3 Объектно-ориентированное программирование на PHP
60 мин
4 Наследование, интерфейсы и полиморфизм
60 мин
5 Основы баз данных MySQL и работа через PDO
60 мин
6 Архитектурный паттерн MVC
60 мин
7 Введение в Laravel и настройка окружения
60 мин
8 Маршрутизация и контроллеры в Laravel
60 мин
9 Шаблонизатор Blade и создание интерфейса
60 мин
10 Миграции баз данных и Eloquent ORM
60 мин
11 Связи моделей в Eloquent — Настройка связей 'один …
60 мин
12 Аутентификация и защита маршрутов
60 мин
13 Разработка каталога товаров и категорий
60 мин
14 Реализация корзины покупок через сессии
60 мин
15 Оформление заказа и транзакции базы данных
60 мин
16 Интеграция платежной системы Stripe
60 мин
17 Интеграция платежной системы Vipps
60 мин
18 Разработка панели администратора
60 мин
19 Оптимизация и подготовка к production
60 мин
20 Деплой Laravel-приложения на сервер
60 мин
21 Основы PHP 8: Синтаксис, переменные и управляющие конструкции
60 мин
22 Функции и массивы в PHP 8
60 мин
23 Объектно-ориентированное программирование: Классы и объекты
60 мин
24 Продвинутое ООП: Наследование, интерфейсы и полиморфизм
60 мин
25 Основы баз данных: Проектирование БД и работа с …
60 мин
26 Взаимодействие PHP с MySQL через PDO
60 мин
27 Архитектура MVC и введение в фреймворк Laravel
60 мин
28 Маршрутизация и контроллеры в Laravel
60 мин
29 Шаблонизатор Blade: Создание пользовательского интерфейса
60 мин
30 Миграции и Eloquent ORM: Создание таблиц товаров
60 мин
31 Связи в Eloquent ORM: Отношения между моделями
60 мин
32 Аутентификация и авторизация пользователей
60 мин
33 Разработка каталога товаров: Вывод, фильтрация и пагинация
60 мин
34 Реализация корзины покупок с использованием сессий
60 мин
35 Оформление заказа: Работа с формами и валидация
60 мин
36 Транзакции базы данных: Сохранение заказа
60 мин
37 Интеграция платежной системы Stripe
60 мин
38 Интеграция платежной системы Vipps
60 мин
39 Создание панели администратора
60 мин
40 Подготовка к production и деплой приложения
60 мин
41 Основы PHP 8 и синтаксис
60 мин
42 Объектно-ориентированное программирование на PHP
60 мин
43 Продвинутое ООП и интерфейсы
60 мин
44 Основы баз данных и MySQL
60 мин
45 Архитектурный паттерн MVC
60 мин
46 Введение в Laravel и маршрутизация
60 мин
47 Шаблонизатор Blade и верстка интерфейса
60 мин
48 Миграции и структура базы данных
60 мин
49 Eloquent ORM и модели
60 мин
50 Отношения в Eloquent ORM
60 мин
51 Авторизация и защита маршрутов
60 мин
52 Создание каталога товаров
60 мин
53 Реализация корзины покупок
60 мин
54 Оформление заказа и транзакции БД
60 мин
55 Интеграция платежной системы Stripe
60 мин
56 Интеграция платежной системы Vipps
60 мин
57 Панель администратора: управление товарами
60 мин
58 Панель администратора: управление заказами
60 мин
59 Подготовка к production и деплой
60 мин
60 Запуск и тестирование готового интернет-магазина
60 мин

Продвинутое ООП: Наследование, интерфейсы и полиморфизм

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

Прогресс урока: 0%

Наследование и абстракция

Продолжаем углубляться в ООП. Наследование позволяет одному классу (дочернему) унаследовать свойства и методы другого класса (родительского). Для этого используется ключевое слово extends. Это избавляет от дублирования кода. Например, у нас может быть базовый класс User, от которого наследуются Customer и Admin. Однако в современной разработке (и в Laravel в частности) чаще применяется композиция и программирование на уровне интерфейсов. Интерфейсы решают проблему жесткой связанности кода. Интерфейс — это контракт. Он не содержит реализации (тела функций), он лишь описывает, какие методы должен обязательно реализовать класс, который этот интерфейс применяет (имплементирует).

В контексте нашего интернет-магазина (см. архив) нам нужно интегрировать две платежные системы: Stripe и Vipps. Если мы жестко привяжем логику Checkout-контроллера к классу Stripe, переключиться на Vipps будет крайне сложно. Вместо этого мы создаем интерфейс PaymentGateway. Этот интерфейс гарантирует, что любой платежный шлюз в нашем проекте будет иметь метод pay(float $amount): bool. Это проявление полиморфизма — мы можем работать с разными объектами (Stripe, Vipps) через единый интерфейс, не задумываясь о том, как именно они реализованы внутри.

php
<?php
// Архивные материалы: Работа с интерфейсами
interface PaymentGateway {
    public function pay(float $amount): bool;
}

// Класс Stripe обязуется реализовать метод pay
class StripeGateway implements PaymentGateway {
    public function pay(float $amount): bool {
        echo "Обработка платежа Stripe на сумму $amount\n";
        // Обращение к Stripe API...
        return true;
    }
}

// Класс Vipps также реализует этот интерфейс
class VippsGateway implements PaymentGateway {
    public function pay(float $amount): bool {
        echo "Инициация платежа Vipps на сумму $amount\n";
        // Обращение к Vipps API...
        return true;
    }
}

// Функция принимает ЛЮБОЙ класс, реализующий интерфейс
function processOrder(PaymentGateway $gateway, float $total) {
    if ($gateway->pay($total)) {
        echo "Заказ успешно оплачен!";
    }
}

$stripe = new StripeGateway();
processOrder($stripe, 150.00);

Внедрение зависимостей (Dependency Injection)

Пример кода выше демонстрирует фундаментальный паттерн проектирования — Внедрение зависимостей (DI). Функция processOrder не создает объект StripeGateway внутри себя с помощью new. Вместо этого она требует передать ей готовый объект, который соответствует контракту PaymentGateway (это указано в типизации аргумента). Почему это важно? Потому что фреймворк Laravel, который мы начнем изучать позже, построен вокруг мощного Service Container, который автоматически разрешает (injects) такие зависимости.

Типичная ошибка новичков — создание экземпляров классов внутри контроллеров. Это делает код нетестируемым. Если вы используете интерфейсы и DI, вы легко можете создать MockGateway (заглушку) для автоматического тестирования корзины без реального списания средств. Принцип "Программируйте на уровне интерфейсов, а не реализаций" (SOLID принципы) — это ключ к масштабируемой архитектуре e-commerce приложений.

Может ли интерфейс в PHP содержать реализацию метода (тело функции)?

Как называется принцип ООП, позволяющий функциям обрабатывать объекты разных классов через единый интерфейс?

Задание

Scaffolding: Добавление нового шлюза

  • Создайте класс PayPalGateway.
  • Укажите, что он имплементирует интерфейс PaymentGateway.
  • Реализуйте метод pay(float $amount), возвращающий true.
  • Измените вызов processOrder(), передав в него экземпляр PayPalGateway.
10 баллов