Введение
Объектно-ориентированное программирование (ООП) — это метод организации кода, при котором данные и функциональность объединены в объекты.
PHP с версии 5 полностью поддерживает ООП, а современные фреймворки (Laravel, Symfony) активно используют его возможности.
В этой статье мы рассмотрим четыре принципа ООП с примерами, диаграммами классов и таблицей модификаторов доступа.
Модификаторы доступа в PHP
Модификаторы доступа управляют видимостью свойств и методов класса.
| Модификатор | Видимость |
|---|---|
public |
Доступен везде: внутри класса, в наследниках и извне. |
protected |
Доступен только внутри класса и его наследников. |
private |
Доступен только внутри класса, в котором объявлен. |
Пример:
class Example {
public string $publicProp = "Доступно везде";
protected string $protectedProp = "Доступно в классе и наследниках";
private string $privateProp = "Доступно только в классе";
}
1. Абстракция
Абстракция выделяет только значимые характеристики объекта, скрывая реализацию.
Пример:
interface PaymentGateway {
public function pay(float $amount): bool;
}
class PayPalGateway implements PaymentGateway {
public function pay(float $amount): bool {
echo "Оплата {$amount} через PayPal\n";
return true;
}
}
class StripeGateway implements PaymentGateway {
public function pay(float $amount): bool {
echo "Оплата {$amount} через Stripe\n";
return true;
}
}
Диаграмма классов:
+------------------+ +------------------+ +------------------+
| PaymentGateway |<------| PayPalGateway | | StripeGateway |
|------------------| |------------------| |------------------|
| + pay(amount) | | + pay(amount) | | + pay(amount) |
+------------------+ +------------------+ +------------------+
2. Инкапсуляция
Инкапсуляция защищает данные и ограничивает доступ к ним.
Пример:
class BankAccount {
private float $balance = 0;
public function deposit(float $amount): void {
if ($amount > 0) {
$this->balance += $amount;
}
}
public function withdraw(float $amount): void {
if ($amount > 0 && $amount <= $this->balance) {
$this->balance -= $amount;
}
}
public function getBalance(): float {
return $this->balance;
}
}
Диаграмма классов:
+------------------+
| BankAccount |
|------------------|
| - balance: float |
|------------------|
| + deposit(amount)|
| + withdraw(amount)|
| + getBalance():float |
+------------------+
3. Наследование
Наследование позволяет создавать новые классы на основе существующих.
Пример:
class Vehicle {
public function move(): void {
echo "Транспорт движется\n";
}
}
class Car extends Vehicle {
public function honk(): void {
echo "Сигнал автомобиля\n";
}
}
Диаграмма классов:
+-----------+
| Vehicle |
|-----------|
| + move() |
+-----------+
^
|
+-----------+
| Car |
|-----------|
| + honk() |
+-----------+
4. Полиморфизм
Полиморфизм позволяет объектам с одинаковым интерфейсом вести себя по-разному.
Пример:
abstract class Shape {
abstract public function getArea(): float;
}
class Circle extends Shape {
public function __construct(private float $radius) {}
public function getArea(): float {
return pi() * pow($this->radius, 2);
}
}
class Rectangle extends Shape {
public function __construct(private float $width, private float $height) {}
public function getArea(): float {
return $this->width * $this->height;
}
}
Диаграмма классов:
+-----------+
| Shape |
|-----------|
| + getArea() : float |
+-----------+
^ ^
| |
+-----------+ +-------------+
| Circle | | Rectangle |
|-----------| |-------------|
| + getArea()| | + getArea() |
+-----------+ +-------------+
Заключение
4 принципа ООП в PHP — это основа написания чистого, масштабируемого и поддерживаемого кода.
Резюме:
- Абстракция — скрытие реализации
- Инкапсуляция — защита данных
- Наследование — переиспользование кода
- Полиморфизм — разные реализации одного интерфейса