🧱 Суть

ООП (объектно-ориентированное программирование) – это подход, при котором код организуется вокруг объектов, которые объединяют:

  • данные (свойства)
  • поведение (методы)

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

Пример:

class User
{
    public string $name;
 
    public function login()
    {
        echo "Пользователь вошёл";
    }
}

Использование:

$user = new User();
 
$user->name = "Alex";
$user->login();

📦 Проблема

1. Большой код сложно поддерживать

Без ООП логика может быть разбросана:

createUser();
validateUser();
sendEmail();
saveUser();

Со временем становится сложно понять:

  • какие данные относятся друг к другу
  • какие функции работают с какими объектами

2. Дублирование кода

Например:

function adminLogin() {}
function userLogin() {}
function managerLogin() {}

Часть логики повторяется.

3. Сложно расширять приложение

При добавлении новых сущностей приходится менять много существующего кода.

✅ Решение

ООП позволяет:

  • объединять данные и логику
  • переиспользовать код
  • создавать понятную структуру приложения
  • разделять ответственность между объектами

Основные понятия:

  • класс
  • объект
  • свойства
  • методы
  • конструктор
  • наследование
  • инкапсуляция
  • полиморфизм

💻 Код

Класс

Класс – это шаблон для создания объектов.

class User
{
    public string $name;
 
    public function sayHello()
    {
        echo "Hello";
    }
}

Класс описывает:

  • какие данные будут у объекта
  • что объект умеет делать

Объект

Объект – конкретный экземпляр класса.
Создание:

$user = new User();

Теперь:

User

$user

User – описание,
$user – конкретный объект.

Свойства класса

Свойства – переменные внутри класса.

class User
{
    public string $name;
    public int $age;
}

Использование:

$user = new User();
 
$user->name = "Ivan";
$user->age = 25;

Доступ к свойствам:

объект->свойство

Методы класса

Методы – функции внутри класса.

class User
{
    public function sayHello()
    {
        echo "Привет";
    }
}

Вызов:

$user->sayHello();

Методы обычно работают с данными объекта.

$this

Внутри класса используется $this для обращения к текущему объекту.

Пример:

class User
{
    public string $name;
 
    public function sayHello()
    {
        echo "Привет, " . $this->name;
    }
}

Использование:

$user = new User();
 
$user->name = "Alex";
$user->sayHello();

Результат:

Привет, Alex

Конструктор construct()

Конструктор вызывается автоматически при создании объекта.

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

Теперь:

$user = new User("Alex");

Свойство сразу заполнено.

Типизация свойств

PHP поддерживает типы:

class User
{
    public string $name;
    public int $age;
    public bool $active;
}

Плюсы:

  • меньше ошибок
  • понятнее код
  • лучше автодополнение IDE

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

Инкапсуляция – сокрытие внутреннего состояния объекта и контроль доступа к нему.
В PHP есть модификаторы:

МодификаторДоступ
publicдоступен везде
protectedкласс и наследники
privateтолько внутри класса
Пример:
class User
{
    private string $password;
 
    public function setPassword(string $password)
    {
        $this->password = $password;
    }
}

Напрямую:

$user->password = "123";

будет ошибкой.

Getter и Setter

Для контролируемого доступа используют методы:

class User
{
    private string $name;
 
    public function getName()
    {
        return $this->name;
    }
 
    public function setName(string $name)
    {
        $this->name = $name;
    }
}

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

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

Пример:

class User
{
    public function login()
    {
        echo "Login";
    }
}
 
class Admin extends User
{
}

Теперь:

$admin = new Admin();
 
$admin->login();

Метод был унаследован.

Переопределение методов

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

class Admin extends User
{
    public function login()
    {
        echo "Admin login";
    }
}

Теперь вызывается версия Admin.

Полиморфизм

Полиморфизм – разные объекты могут иметь одинаковый интерфейс, но разное поведение.

Пример:

interface Payment
{
    public function pay();
}

Реализации:

class CardPayment implements Payment
{
    public function pay()
    {
        echo "Оплата картой";
    }
}
 
 
class CashPayment implements Payment
{
    public function pay()
    {
        echo "Оплата наличными";
    }
}

Использование:

function checkout(Payment $payment)
{
    $payment->pay();
}

Функции не важно, какой объект передан.

Абстрактные классы

Абстрактный класс нельзя создать напрямую.

abstract class Animal
{
    abstract public function makeSound();
}

Наследники обязаны реализовать метод:

class Cat extends Animal
{
    public function makeSound()
    {
        echo "Мяу";
    }
}

Статические свойства и методы

Принадлежат классу, а не объекту.

class Counter
{
    public static int $count = 0;
}

Использование:

Counter::$count;

Метод:

class Math
{
    public static function sum($a, $b)
    {
        return $a + $b;
    }
}

Вызов:

Math::sum(2, 3);

Типичная структура ООП-проекта

В современных PHP-приложениях:

src/

├── Models/
│   └── User.php

├── Services/
│   └── UserService.php

├── Controllers/
│   └── UserController.php

└── Repositories/
    └── UserRepository.php

Каждый класс отвечает за свою часть логики.

Частые ошибки

Создание слишком больших классов

Плохо:

class User
{
    // регистрация
    // отправка email
    // работа с БД
    // валидация
}

Лучше разделять ответственность:

User
UserService
UserRepository
Mailer

Использование наследования вместо композиции

Не всегда нужно:

class Admin extends User

Иногда лучше:

class Admin
{
    private PermissionService $permissions;
}

Смешивание данных и логики

Модель не должна делать всё:

$user->sendEmail();
$user->saveToDatabase();

Чаще используют отдельные сервисы.

🎯 Вывод

  • класс – это шаблон объекта
  • объект – экземпляр класса
  • свойства хранят данные
  • методы описывают поведение
  • __construct() задаёт начальное состояние
  • инкапсуляция защищает внутренние данные
  • наследование позволяет переиспользовать код
  • полиморфизм позволяет работать через общий интерфейс
  • современные PHP-приложения строятся вокруг классов и разделения ответственности

🔗 Связано