← Назад к вопросам

Какие знаешь парадигмы ООП?

1.0 Junior🔥 221 комментариев
#ООП

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Парадигмы ООП (Объектно-Ориентированного Программирования)

ООП основано на четырёх главных парадигмах (принципах), которые описывают основные характеристики объектов и их взаимодействие.

1. Инкапсуляция (Encapsulation)

Инкапсуляция — это скрытие внутреннего состояния объекта и предоставление контролируемого доступа через методы.

class BankAccount {
    private $balance = 0; // Скрыто
    
    public function deposit($amount) {
        if ($amount > 0) {
            $this->balance += $amount; // Контролируемый доступ
        }
    }
    
    public function getBalance() {
        return $this->balance; // Только чтение
    }
}

$account = new BankAccount();
$account->deposit(100);
echo $account->getBalance(); // 100
// $account->balance = 0; // Ошибка: private

Преимущества:

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

2. Наследование (Inheritance)

Наследование — это возможность создавать новые классы на основе существующих, переиспользуя и расширяя их функциональность.

class Animal {
    protected $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
    
    public function speak() {
        echo "{$this->name} делает звук";
    }
}

class Dog extends Animal {
    public function speak() { // Переопределение
        echo "{$this->name} лает: Гав!";
    }
}

class Cat extends Animal {
    public function speak() { // Переопределение
        echo "{$this->name} мяукает: Мяу!";
    }
}

$dog = new Dog('Rex');
$dog->speak(); // Rex лает: Гав!

$cat = new Cat('Whiskers');
$cat->speak(); // Whiskers мяукает: Мяу!

Преимущества:

  • Переиспользование кода (код живёт в родителе)
  • Полиморфизм (разное поведение, один интерфейс)
  • Иерархия классов (логическая структура)

3. Полиморфизм (Polymorphism)

Полиморфизм — это способность объектов разных классов отвечать на одно и то же сообщение по-разному.

interface Shape {
    public function area();
}

class Circle implements Shape {
    private $radius;
    
    public function __construct($radius) {
        $this->radius = $radius;
    }
    
    public function area() {
        return pi() * $this->radius ** 2;
    }
}

class Rectangle implements Shape {
    private $width;
    private $height;
    
    public function __construct($width, $height) {
        $this->width = $width;
        $this->height = $height;
    }
    
    public function area() {
        return $this->width * $this->height;
    }
}

function printArea(Shape $shape) {
    echo 'Площадь: ' . $shape->area(); // Полиморфизм!
}

printArea(new Circle(5)); // Выведет: 78.54...
printArea(new Rectangle(4, 5)); // Выведет: 20

Виды полиморфизма:

  • Параметрический (Generics) — работа с разными типами
  • Подтипный (Subtyping) — переопределение методов в наследниках
  • Ad-hoc — перегрузка методов (в PHP ограничено)

4. Абстракция (Abstraction)

Абстракция — это выделение сущности, скрытие лишних деталей, показ только важного интерфейса.

abstract class Database {
    abstract public function connect(); // Подклассы обязаны реализовать
    
    public function query($sql) { // Общая логика
        $this->connect();
        return $this->execute($sql);
    }
    
    abstract protected function execute($sql);
}

class MySQL extends Database {
    public function connect() {
        // MySQL подключение
    }
    
    protected function execute($sql) {
        // MySQL исполнение
    }
}

class PostgreSQL extends Database {
    public function connect() {
        // PostgreSQL подключение
    }
    
    protected function execute($sql) {
        // PostgreSQL исполнение
    }
}

$db = new MySQL();
$db->query('SELECT * FROM users'); // Клиент не знает о деталях

Что скрыто:

  • Как подключаться к БД
  • Как выполняются запросы
  • Специфика каждой БД

Что видно:

  • Метод query()
  • Простой интерфейс для работы

Взаимодействие парадигм

// Все 4 парадигмы вместе

// Абстракция + Инкапсуляция
abstract class PaymentGateway {
    private $apiKey; // Инкапсуляция
    
    protected function getApiKey() {
        return $this->apiKey;
    }
    
    abstract public function charge($amount); // Абстракция
}

// Наследование
class StripeGateway extends PaymentGateway {
    public function charge($amount) {
        // Использует защищённый метод
        $key = $this->getApiKey();
        return ['status' => 'success', 'amount' => $amount];
    }
}

// Полиморфизм
function processPayment(PaymentGateway $gateway, $amount) {
    return $gateway->charge($amount); // Работает с любым шлюзом
}

processPayment(new StripeGateway(), 100);

Таблица парадигм

ПарадигмаЧто?Зачем?
ИнкапсуляцияСкрытие данных + методы доступаЗащита, валидация
НаследованиеКласс наследует от другогоПереиспользование кода
ПолиморфизмРазное поведение, один интерфейсГибкость, расширяемость
АбстракцияВыделение существенногоУпрощение, скрытие сложности

Реальный пример

// E-commerce система

// Абстракция: интерфейс платежей
interface PaymentProcessor {
    public function process($amount);
}

// Наследование + инкапсуляция
class CreditCardProcessor implements PaymentProcessor {
    private $cardNumber; // Инкапсуляция
    
    public function __construct($cardNumber) {
        $this->cardNumber = substr($cardNumber, -4); // Скрываем
    }
    
    public function process($amount) {
        return ['status' => 'success', 'card' => 'XXXX' . $this->cardNumber];
    }
}

// Полиморфизм: разные процессоры
class PayPalProcessor implements PaymentProcessor {
    public function process($amount) {
        return ['status' => 'success', 'method' => 'paypal'];
    }
}

// Клиентский код (не зависит от реализации)
class Order {
    public function pay(PaymentProcessor $processor, $amount) {
        return $processor->process($amount);
    }
}

// Использование
$order = new Order();
$order->pay(new CreditCardProcessor('1234567890123456'), 100);
$order->pay(new PayPalProcessor(), 50);
Какие знаешь парадигмы ООП? | PrepBro