Уроки курса
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 потребует переписывания половины приложения. Чтобы этого избежать, мы используем Интерфейсы и Полиморфизм.

Интерфейс в ООП — это строгий контракт. Он описывает, что должен делать класс (какие методы он должен иметь), но не описывает, как он должен это делать. Любой класс, который реализует (implements) интерфейс, обязан содержать код для всех методов, описанных в интерфейсе.

Полиморфизм означает 'множество форм'. В контексте программирования это способность функции обрабатывать объекты разных классов одинаково, если они реализуют один и тот же интерфейс. Наш класс оформления заказа (Checkout) не должен знать, как работает Stripe или Vipps под капотом. Он должен знать только одно: у любого переданного ему платежного шлюза есть метод pay().

Это критически важный принцип архитектуры (SOLID - Dependency Inversion Principle), который позволяет масштабировать интернет-магазин без боли.

php
<?php
// Практика: Работа с интерфейсами (Архивный вариант 1, Упражнение 1.3)

// Создаем контракт (интерфейс)
interface PaymentGateway {
    // Любой класс, реализующий этот интерфейс, обязан иметь метод pay
    // принимающий float и возвращающий bool
    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 {
        // Здесь была бы логика инициации платежа через Vipps API
        echo "Инициация платежа ${amount} через Vipps... Ожидание подтверждения.\n";
        return true;
    }
}

// Клиентский код (например, метод в CheckoutController)
// Мы требуем ЛЮБОЙ объект, который реализует интерфейс PaymentGateway
function processOrder(PaymentGateway $gateway, float $total) {
    if ($gateway->pay($total)) {
        echo "Заказ успешно оформлен!\n";
    } else {
        echo "Ошибка оплаты.\n";
    }
}

// Теперь мы можем легко менять платежные шлюзы, не меняя логику processOrder!
$stripe = new StripeGateway();
processOrder($stripe, 150.00);

$vipps = new VippsGateway();
processOrder($vipps, 45.50);
?>

Типичные ошибки новичков при работе с интерфейсами

При использовании метода Mastery Learning важно разобрать частые ошибки, чтобы не допускать их в будущем:

  • Изменение сигнатуры метода: Если в интерфейсе метод определен как pay(float $amount): bool, вы не можете в классе StripeGateway написать pay($amount) без указания типов, или изменить тип аргумента на int. Сигнатура должна совпадать абсолютно точно, иначе PHP выдаст фатальную ошибку (Fatal error: Declaration must be compatible).
  • Добавление логики в интерфейс: Интерфейсы не могут содержать реализацию методов (тело функции с фигурными скобками {}). Они содержат только объявления.
  • Создание экземпляра интерфейса: Вы не можете написать new PaymentGateway(). Интерфейс — это абстракция, создать можно только объект конкретного класса, который этот интерфейс реализует.

Использование интерфейсов подготавливает нас к паттерну Service Container в Laravel, где мы сможем автоматически подменять реализации (например, использовать фиктивный шлюз для тестов и реальный Stripe для production).

Что произойдет, если класс заявит, что реализует интерфейс (implements), но не определит один из методов, описанных в интерфейсе?

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