Уроки курса
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 мин

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

Создание гибкой архитектуры приложения с помощью интерфейсов и абстрактных классов на примере интеграции платежных шлюзов (Stripe, Vipps).

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

В рамках Project-Based Learning мы подошли к реальной задаче: интернет-магазин должен принимать оплату через разные системы — Stripe и Vipps (популярна в Норвегии). Если мы напишем логику оплаты жестко под Stripe, добавить Vipps будет огромной болью. Здесь на помощь приходят Интерфейсы и Полиморфизм. Интерфейс — это строгий контракт. Он не содержит реализации (тела функций), он только говорит: "Любой класс, который реализует этот интерфейс, ОБЯЗАН иметь такие-то методы". Полиморфизм (многообразие форм) позволяет нашему Checkout-контроллеру работать с любым платежным шлюзом одинаково, даже не зная, Stripe это, Vipps или PayPal. Контроллер просто вызывает метод pay(), потому что интерфейс гарантирует его наличие.

php
<?php
// Создаем контракт (интерфейс)
interface PaymentGateway {
    public function pay(float $amount): bool;
}

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

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

Как это применяется на практике? В нашем классе OrderProcessor мы не будем указывать конкретный класс Stripe или Vipps. Мы укажем интерфейс PaymentGateway. Этот паттерн называется Внедрение зависимостей (Dependency Injection). Благодаря этому мы можем легко переключать платежные системы. Если клиент из США — мы передаем в процессор объект StripeGateway. Если из Норвегии — VippsGateway. Код самого обработчика заказов при этом не меняется ни на одну строчку! Это и есть сила ООП и правильной архитектуры. Типичная ошибка новичков — писать огромные конструкции if ($paymentType == 'stripe') { ... } else if (...) { ... } прямо в контроллере. Использование интерфейсов делает код чистым, масштабируемым и легко тестируемым.

php
<?php
// Класс обработки заказа
class OrderProcessor {
    // Внедрение зависимости через интерфейс
    public function __construct(private PaymentGateway $gateway) {}

    public function checkout(float $totalAmount) {
        // Полиморфизм в действии: мы не знаем, какой это шлюз, но метод pay() точно есть
        if ($this->gateway->pay($totalAmount)) {
            echo "Заказ успешно оформлен!";
        } else {
            echo "Ошибка оплаты.";
        }
    }
}

// Использование
$stripe = new StripeGateway();
$processor = new OrderProcessor($stripe);
$processor->checkout(150.00);
?>

Может ли интерфейс содержать логику работы (тело функции)?

Какое ключевое слово используется в определении класса, чтобы указать, что он подчиняется контракту интерфейса?