Встречается на 26% собеседований по PHP

Что такое ООП

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

Основные концепции ООП

ООП строится на четырёх ключевых принципах, которые определяют стиль проектирования и написания кода.

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

Класс — это шаблон или чертёж, описывающий структуру и поведение будущих объектов. Объект — конкретный экземпляр класса, обладающий собственным состоянием (значениями свойств) и доступом к методам класса. Например, класс User может описывать пользователя, а объекты $user1, $user2 — конкретных пользователей с разными именами и email.

php
class User {
    public string $name;
    public string $email;

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

    public function getInfo(): string {
        return "{$this->name} <{$this->email}>";
    }
}

$user = new User('Иван', 'ivan@example.com');
echo $user->getInfo(); // Иван <ivan@example.com>

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

Инкапсуляция скрывает внутреннюю реализацию объекта и предоставляет доступ к данным только через публичные методы. Это защищает состояние объекта от некорректного изменения извне и упрощает поддержку кода. В PHP для этого используются модификаторы доступа: public, protected, private.

php
class BankAccount {
    private float $balance = 0;

    public function deposit(float $amount): void {
        if ($amount > 0) {
            $this->balance += $amount;
        }
    }

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

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

Наследование позволяет создавать новый класс на основе существующего, перенимая его свойства и методы. Это способствует повторному использованию кода и построению иерархий. Дочерний класс может расширять или переопределять поведение родительского.

php
class Animal {
    public function speak(): string {
        return 'Some sound';
    }
}

class Dog extends Animal {
    public function speak(): string {
        return 'Woof!';
    }
}

Полиморфизм

Полиморфизм — способность объектов разных классов реагировать на одинаковые вызовы методов по-разному. Это позволяет единообразно работать с объектами, имеющими общий интерфейс или базовый класс. В PHP полиморфизм реализуется через интерфейсы, абстрактные классы и переопределение методов.

php
interface Shape {
    public function area(): float;
}

class Circle implements Shape {
    public function __construct(private float $radius) {}

    public function area(): float {
        return pi() * $this->radius ** 2;
    }
}

class Square implements Shape {
    public function __construct(private float $side) {}

    public function area(): float {
        return $this->side ** 2;
    }
}

function printArea(Shape $shape): void {
    echo $shape->area();
}

Абстракция

Абстракция выделяет существенные характеристики объекта, игнорируя несущественные детали. В ООП она выражается через абстрактные классы и интерфейсы, которые задают контракт для подклассов, не реализуя конкретное поведение.

php
abstract class Database {
    abstract public function connect(): void;
}

class MySQLDatabase extends Database {
    public function connect(): void {
        // реализация подключения к MySQL
    }
}

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

  • Модульность: код разбит на независимые классы, каждый из которых отвечает за свою часть функциональности.
  • Повторное использование: наследование и композиция позволяют переиспользовать и расширять существующий код без дублирования.
  • Масштабируемость: новые возможности добавляются через новые классы, не затрагивая существующую систему.
  • Поддерживаемость: чёткая структура и изоляция компонентов упрощают поиск ошибок и внесение изменений.

Подводные камни

  • Злоупотребление наследованием: глубокие иерархии классов усложняют понимание кода. Предпочтение стоит отдавать композиции.
  • Нарушение инкапсуляции: публичные свойства без контроля доступа могут привести к некорректному состоянию объекта.
  • Избыточная абстракция: слишком много интерфейсов и абстрактных классов усложняют код без реальной пользы.

Коротко

  • ООП — парадигма, основанная на объектах, объединяющих данные и методы.
  • Четыре принципа: инкапсуляция, наследование, полиморфизм, абстракция.
  • ООП даёт модульность, переиспользование, масштабируемость и поддерживаемость.
  • В PHP ООП реализуется через классы, интерфейсы, абстрактные классы и модификаторы доступа.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы