🧱 Суть
ООП (объектно-ориентированное программирование) – это подход, при котором код организуется вокруг объектов, которые объединяют:
- данные (свойства)
- поведение (методы)
Вместо набора разрозненных функций создаются сущности, которые описывают реальные объекты приложения.
Пример:
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
↓
$userUser – описание,
$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-приложения строятся вокруг классов и разделения ответственности