OXBOX Help

ООП

Что это?

Зачем нужно?

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

Что это?

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

Зачем нужно?

Безопасность: Защищает данные от несанкционированного доступа и изменений. Данные можно изменять только через специально разработанные методы (геттеры и сеттеры). Гибкость: Позволяет изменять внутреннюю реализацию класса, не затрагивая код, который использует этот класс (если интерфейс остается прежним). Модульность: Облегчает поддержку и понимание кода, так как логика класса изолирована. Как реализуется в PHP: Использование модификаторов доступа ( public, private, protected ): public: Доступ к атрибуту/методу из любого места. private: Доступ только внутри класса. protected: Доступ внутри класса и в классах-наследниках. Геттеры и сеттеры (методы для получения и установки значений приватных атрибутов).

Полиморфизм:

Что это?

Способность объектов разных классов реагировать на один и тот же вызов метода по-разному. Позволяет использовать объекты разных классов взаимозаменяемо. Существуют два основных типа полиморфизма: Полиморфизм подтипов (subtype polymorphism): Объекты подклассов могут использоваться там, где ожидаются объекты родительского класса (благодаря наследованию). Параметрический полиморфизм (parametric polymorphism): Применение обобщенного кода, который может работать с различными типами данных (например, generics - в PHP реализовано через @template).

Зачем нужно?

Гибкость: Позволяет легко расширять функциональность без изменения существующего кода. Переиспользование кода: Позволяет писать более обобщенный код, который может работать с разными типами объектов. Упрощение: Упрощает код, позволяя работать с объектами как с единым интерфейсом, независимо от их конкретного класса. Как реализуется в PHP: Наследование и переопределение методов (method overriding): Подкласс переопределяет метод родительского класса, предоставляя свою реализацию. Интерфейсы: Классы реализуют интерфейсы, определяя набор методов, которые они должны реализовать.

Абстракция:

Что это?

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

Зачем нужно?

Упрощение: Упрощает понимание и использование сложных систем, скрывая детали реализации. Гибкость: Позволяет изменять реализацию, не затрагивая код, который использует абстрактный объект (если интерфейс остается прежним). Переиспользование кода: Позволяет создавать обобщенные интерфейсы и классы, которые могут использоваться в разных контекстах.

Как реализуется в PHP:

Абстрактные классы: Классы, которые не могут быть созданы напрямую (используются только как родительские классы). Они могут содержать абстрактные методы (методы без реализации, которые должны быть реализованы в подклассах). Интерфейсы: Полностью абстрактные классы, которые определяют только интерфейс (набор методов), без реализации.

<?php // Инкапсуляция class Account { private $balance; // Приватный атрибут public function __construct(float $initialBalance) { $this->balance = $initialBalance; } public function deposit(float $amount): void { $this->balance += $amount; } public function withdraw(float $amount): void { if ($this->balance >= $amount) { $this->balance -= $amount; } else { echo "Insufficient funds.\n"; } } public function getBalance(): float { // Геттер return $this->balance; } } // Полиморфизм (с использованием наследования и переопределения) class SavingAccount extends Account { private $interestRate; public function __construct(float $initialBalance, float $interestRate) { parent::__construct($initialBalance); $this->interestRate = $interestRate; } public function calculateInterest(): float { return $this->getBalance() * $this->interestRate; } // Переопределение метода withdraw public function withdraw(float $amount): void { if ($this->getBalance() >= $amount + 10) { // Добавляем комиссию parent::withdraw($amount + 10); // вызываем родительский метод } else { echo "Insufficient funds for withdrawal (with commission).\n"; } } } // Абстракция (с использованием абстрактного класса и интерфейса) abstract class Shape { abstract public function getArea(): float; // Абстрактный метод public function getColor(): string { return "default color"; } } class Circle extends Shape { private $radius; public function __construct(float $radius) { $this->radius = $radius; } public function getArea(): float { // Реализация абстрактного метода return pi() * $this->radius * $this->radius; } } interface Printable { public function print(): string; } class Document implements Printable { private $content; public function __construct(string $content) { $this->content = $content; } public function print(): string { return "Printing document: " . $this->content; } } // Использование $account = new Account(100); $account->deposit(50); echo "Balance: " . $account->getBalance() . "\n"; // Balance: 150 $savingAccount = new SavingAccount(200, 0.05); $savingAccount->withdraw(20); echo "Saving Account Balance: " . $savingAccount->getBalance() . "\n"; $circle = new Circle(5); echo "Circle Area: " . $circle->getArea() . "\n"; // Circle Area: 78.539816339745 $document = new Document("Hello, world!"); echo $document->print() . "\n"; // Printing document: Hello, world!
25 июня 2025