Комментарии (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);