Объектно-ориентированное программирование в PHP

Объектно-ориентированное программирование в PHP

Объектно-ориентированное программирование (ООП) – это одна из ключевых парадигм программирования, позволяющая организовывать код в виде объектов. В PHP ООП реализовано через классы, объекты, наследование, полиморфизм и инкапсуляцию. Начиная с версии PHP 8, появились дополнительные возможности, такие как default-методы в интерфейсах.

Основные принципы ООП в PHP

1. Классы и объекты

Класс – это шаблон, по которому создаются объекты. Объект – это экземпляр класса.

class Car {
    public $brand;

    public function drive() {
        echo "Driving...";
    }
}

$car = new Car();
$car->brand = "Toyota";
echo $car->brand;
$car->drive();

2. Инкапсуляция

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

class BankAccount {
    private $balance = 0;

    public function deposit($amount) {
        $this->balance += $amount;
    }

    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount();
$account->deposit(100);
echo $account->getBalance();

3. Наследование

Наследование позволяет одному классу заимствовать свойства и методы другого.

class Vehicle {
    public function start() {
        echo "Starting the engine...";
    }
}

class Car extends Vehicle {
    public function honk() {
        echo "Beep beep!";
    }
}

$myCar = new Car();
$myCar->start();
$myCar->honk();

4. Полиморфизм

Полиморфизм позволяет использовать один интерфейс для разных типов объектов.

interface Logger {
    public function log($message);
}

class FileLogger implements Logger {
    public function log($message) {
        echo "Logging to file: $message";
    }
}

class DatabaseLogger implements Logger {
    public function log($message) {
        echo "Logging to database: $message";
    }
}

function writeLog(Logger $logger, $message) {
    $logger->log($message);
}

writeLog(new FileLogger(), "Error 404");
writeLog(new DatabaseLogger(), "Error 500");

Абстрактные классы и интерфейсы

Абстрактный класс – это класс, который нельзя создать напрямую. Он служит как шаблон для других классов.

abstract class Animal {
    protected $name;

    public function __construct($name) {
        $this->name = $name;
    }

    abstract public function makeSound();
}

class Dog extends Animal {
    public function makeSound() {
        return "Bark!";
    }
}

$dog = new Dog("Buddy");
echo $dog->makeSound();

Интерфейсы определяют контракты для классов, но не содержат реализацию методов.

interface Swimmable {
    public function swim();
}

class Fish implements Swimmable {
    public function swim() {
        echo "Swimming...";
    }
}

$fish = new Fish();
$fish->swim();

Использование default-методов в интерфейсах (PHP 8+)

С PHP 8 интерфейсы могут содержать методы с реализацией.

interface Logger {
    public function log($message);

    public function formatMessage($message) {
        return "[LOG]: " . strtoupper($message);
    }
}

class FileLogger implements Logger {
    public function log($message) {
        echo $this->formatMessage($message);
    }
}

$logger = new FileLogger();
$logger->log("message received");

SOLID-принципы в ООП

  1. S - Принцип единственной ответственности (SRP)

Класс должен отвечать только за одну задачу.

class User {
    public function register($email) {
        // логика регистрации
    }
}

class Mailer {
    public function sendEmail($email) {
        // логика отправки письма
    }
}
  1. O - Принцип открытости/закрытости (OCP)

Классы должны быть открыты для расширения, но закрыты для изменения.

interface PaymentMethod {
    public function pay();
}

class PayPal implements PaymentMethod {
    public function pay() {
        echo "Paid via PayPal";
    }
}

class Stripe implements PaymentMethod {
    public function pay() {
        echo "Paid via Stripe";
    }
}

function processPayment(PaymentMethod $payment) {
    $payment->pay();
}

processPayment(new PayPal());
processPayment(new Stripe());
  1. L - Принцип подстановки Лисков (LSP)

Дочерний класс должен заменять родительский без изменения поведения.

abstract class Bird {
    abstract public function move();
}

class Sparrow extends Bird {
    public function move() {
        return "Flying...";
    }
}

class Penguin extends Bird {
    public function move() {
        return "Swimming...";
    }
}

Полезные ссылки

  1. Официальная документация PHP по ООП
  2. SOLID-принципы в PHP
  3. Статья о паттернах проектирования в PHP
  4. Нововведения PHP 8

Этот материал охватывает ключевые аспекты ООП в PHP. Если у вас есть вопросы или идеи для дальнейшего изучения, пишите в комментариях.

Recent blogs
Структурные паттерны в программировании

Структурные паттерны в программировании

Порождающие паттерны в программировании

Порождающие паттерны в программировании

Генераторы и итераторы в PHP

Генераторы и итераторы в PHP

Структуры данных в PHP

Структуры данных в PHP

HTTP-методы

HTTP-методы