Ответ
В классической формулировке четырех принципов ООП четвертым является инкапсуляция. Иногда в качестве четвертого принципа также называют абстракцию, что создает терминологическую путаницу.
Инкапсуляция — это механизм, объединяющий данные и методы, которые с ними работают, и ограничивающий прямой доступ к внутреннему состоянию объекта. Это реализуется через модификаторы доступа (public, protected, private).
Пример на PHP:
class BankAccount {
private float $balance = 0.0;
public function deposit(float $amount): void {
if ($amount > 0) {
$this->balance += $amount;
}
}
public function getBalance(): float {
return $this->balance;
}
}
$account = new BankAccount();
$account->deposit(100.50);
// Прямой доступ к $balance невозможен: $account->balance = -100; // Fatal error
Абстракция как принцип — это выделение существенных характеристик объекта, игнорируя нерелевантные детали реализации. На практике она выражается через абстрактные классы и интерфейсы.
Пример абстракции:
interface PaymentProcessor {
public function process(float $amount): bool;
}
class StripeProcessor implements PaymentProcessor {
public function process(float $amount): bool {
// Детали интеграции со Stripe скрыты
return true;
}
}
Важно не путать эти базовые принципы ООП с принципами SOLID, где четвертым является Interface Segregation Principle (ISP) — принцип разделения интерфейсов.
Ответ 18+ 🔞
Слушай, а вот эта вся история с ООП-принципами — это просто ёперный театр какой-то. Сидят умники, спорят, какой из них четвёртый, как будто от этого их код перестанет быть говном. «Инкапсуляция!» — «Нет, абстракция!». Да похуй, в общем-то, если ты понимаешь, о чём речь.
Ну ладно, раз уж начали. Инкапсуляция — это когда ты свою внутреннюю кухню прячешь, чтобы всякие левые хулиганы не лезли и не ломали. Типа, вот у тебя класс BankAccount. Баланс — это святое, его нельзя просто так с улицы менять. Иначе какой-нибудь пидарас шерстяной напишет $account->balance = -1000000; и будет тебе хиросима. Поэтому ты делаешь свойство private и даёшь только правильные методы, типа deposit. Всё логично.
class BankAccount {
private float $balance = 0.0;
public function deposit(float $amount): void {
if ($amount > 0) {
$this->balance += $amount;
}
}
public function getBalance(): float {
return $this->balance;
}
}
$account = new BankAccount();
$account->deposit(100.50);
// Попробуй теперь сюда сунуться: $account->balance = -100; // Получишь, сука, фаталку в лоб.
А абстракция — это когда ты от реальной жести отгораживаешься красивым забором. Тебе похуй, как там внутри Stripe или PayPal шестерёнки крутятся. Тебе главное — есть интерфейс PaymentProcessor с методом process(). Под капотом хоть мартышлюшка на велосипеде крути, лишь бы деньги прошли. Это и есть выделение сути, отсечение всей лишней хуйни.
interface PaymentProcessor {
public function process(float $amount): bool;
}
class StripeProcessor implements PaymentProcessor {
public function process(float $amount): bool {
// А вот тут внутри может быть овердохуища кода, но тебе это не видно.
// И слава богу.
return true;
}
}
И вот тут главное — не перепутать эту базовую четвёрку с SOLID, а то некоторые чуваки, блядь, начинают мешать всё в кучу. В SOLID-е четвёртый — это ISP, принцип разделения интерфейсов. Это когда ты не делаешь один жирный интерфейс на все случаи жизни, а дробишь его на узкие и понятные. Чтобы классу-клиенту не приходилось реализовывать методы, которые ему нахуй не сдались. А то получится пиздопроебина, где Robot будет вынужден иметь метод eat().
Короче, суть в чём: учи матчасть, чтобы не выглядеть ебанько на собеседовании. И помни, что все эти принципы — не догма, а инструменты. Главное — чтобы система работала и не была хитрой жопой, в которой через полгода разберётся только тот, кто её писал, да и то если не забудет.