На 34-м уроке мы с вами погрузимся в одну из интересных тем в программировании, это объектно-ориентированное программирование (ООП). Если вы дошли до этого урока, то уже знаете основы PHP, умеете работать с переменными, функциями, массивами и циклами. Теперь пришло время сделать следующий шаг и освоить ООП, которое позволит вам писать более структурированный, гибкий и поддерживаемый код.
Введение в объектно-ориентированное программирование
Объектно-ориентированное программирование (ООП) это парадигма программирования, которая основана на концепции объектов. В отличие от процедурного подхода, где код состоит из функций и процедур, ООП позволяет объединять данные и методы, которые работают с этими данными, в единые структуры — объекты.
Основные принципы ООП:
- Инкапсуляция — сокрытие внутренней реализации объекта и предоставление только необходимого интерфейса для взаимодействия с ним.
- Наследование — возможность создания новых классов на основе существующих, что позволяет повторно использовать код.
- Полиморфизм — возможность объектов с одинаковым интерфейсом иметь разную реализацию.
- Абстракция — выделение главных характеристик объекта и игнорирование второстепенных.
ООП делает код более модульным, что упрощает его поддержку и расширение. Давайте разберем, как это работает в PHP.
Создание классов и объектов
Что такое класс?
Класс это шаблон или чертеж для создания объектов. Он определяет свойства (атрибуты) и методы (функции), которые будут доступны у объектов, созданных на основе этого класса.
Пример простого класса:
class Car { // Свойства класса public $brand; public $model; public $year; // Метод класса public function startEngine() { return "Двигатель автомобиля {$this->brand} {$this->model} запущен!"; } }
Здесь мы создали класс Car
, который имеет три свойства: brand
, model
и year
. Также у класса есть метод startEngine
, который возвращает строку с информацией о запуске двигателя.
Что такое объект?
Объект это экземпляр класса. Когда мы создаем объект, мы используем класс как шаблон для создания конкретной сущности.
Пример создания объекта:
$myCar = new Car(); $myCar->brand = "Toyota"; $myCar->model = "Corolla"; $myCar->year = 2020; echo $myCar->startEngine(); // Выведет: Двигатель автомобиля Toyota Corolla запущен!
Здесь мы создали объект $myCar
на основе класса Car
, установили значения свойств и вызвали метод startEngine
.
Конструкторы
Конструктор это специальный метод, который автоматически вызывается при создании объекта. Он используется для инициализации свойств объекта.
Пример класса с конструктором:
class Car { public $brand; public $model; public $year; // Конструктор public function __construct($brand, $model, $year) { $this->brand = $brand; $this->model = $model; $this->year = $year; } public function startEngine() { return "Двигатель автомобиля {$this->brand} {$this->model} запущен!"; } } $myCar = new Car("Toyota", "Corolla", 2020); echo $myCar->startEngine(); // Выведет: Двигатель автомобиля Toyota Corolla запущен!
Теперь при создании объекта $myCar
мы сразу передаем значения свойств через конструктор.
Инкапсуляция
Инкапсуляция позволяет скрыть внутреннюю реализацию объекта и предоставить только необходимый интерфейс для работы с ним. В PHP для этого используются модификаторы доступа: public
, protected
и private
.
public
— свойства и методы доступны из любого места.protected
— свойства и методы доступны только внутри класса и его потомков.private
— свойства и методы доступны только внутри класса.
Пример использования инкапсуляции:
class Car { private $brand; private $model; private $year; public function __construct($brand, $model, $year) { $this->brand = $brand; $this->model = $model; $this->year = $year; } public function getBrand() { return $this->brand; } public function getModel() { return $this->model; } public function getYear() { return $this->year; } public function startEngine() { return "Двигатель автомобиля {$this->brand} {$this->model} запущен!"; } } $myCar = new Car("Toyota", "Corolla", 2020); echo $myCar->getBrand(); // Выведет: Toyota echo $myCar->startEngine(); // Выведет: Двигатель автомобиля Toyota Corolla запущен!
Здесь свойства brand
, model
и year
являются приватными, и доступ к ним возможен только через публичные методы getBrand
, getModel
и getYear
.
Практические задачи
- Создание класса «Книга».
Создайте классBook
, который будет иметь свойстваtitle
,author
иyear
. Добавьте методgetInfo
, который возвращает строку с информацией о книге. Создайте объект этого класса и выведите информацию о книге. - Инкапсуляция: класс «Банковский счет».
Создайте классBankAccount
, который будет иметь приватное свойствоbalance
(баланс). Добавьте методыdeposit
(пополнение счета) иwithdraw
(снятие средств), а также методgetBalance
для получения текущего баланса.
Примеры кода
Задача 1: Класс «Книга»
class Book { public $title; public $author; public $year; public function __construct($title, $author, $year) { $this->title = $title; $this->author = $author; $this->year = $year; } public function getInfo() { return "Книга: {$this->title}, Автор: {$this->author}, Год: {$this->year}"; } } $book = new Book("1984", "Джордж Оруэлл", 1949); echo $book->getInfo();
Задача 2: Класс «Электронная книга»
class EBook extends Book { private $fileSize; public function __construct($title, $author, $year, $fileSize) { parent::__construct($title, $author, $year); $this->fileSize = $fileSize; } public function getInfo() { return parent::getInfo() . ", Размер файла: {$this->fileSize} MB"; } } $ebook = new EBook("1984", "Джордж Оруэлл", 1949, 2.5); echo $ebook->getInfo();
Задача 3: Класс «Банковский счет»
class BankAccount { private $balance = 0; public function deposit($amount) { $this->balance += $amount; } public function withdraw($amount) { if ($amount <= $this->balance) { $this->balance -= $amount; } else { echo "Недостаточно средств на счете."; } } public function getBalance() { return $this->balance; } } $account = new BankAccount(); $account->deposit(1000); $account->withdraw(500); echo $account->getBalance();
Задача 4: Классы «Фигуры»
class Shape { public function area() { return 0; } } class Rectangle extends Shape { private $width; private $height; public function __construct($width, $height) { $this->width = $width; $this->height = $height; } public function area() { return $this->width * $this->height; } } class Circle extends Shape { private $radius; public function __construct($radius) { $this->radius = $radius; } public function area() { return pi() * pow($this->radius, 2); } } $shapes = [new Rectangle(4, 5), new Circle(3)]; foreach ($shapes as $shape) { echo "Площадь фигуры: " . $shape->area() . "\n"; }
Сегодня мы изучили основы объектно-ориентированного программирования в PHP. Вы узнали, как создавать классы и объекты, работать с конструкторами и инкапсуляцией. Эти концепции являются фундаментальными для написания качественного и поддерживаемого кода.
Практикуйтесь и решайте задачи. Чем больше вы пишете, тем лучше понимаете принципы ООП.
Если вы хотите изучить PHP от начала до конца, рекомендую ознакомиться с моим полным курсом по PHP для начинающих: https://max-gabov.ru/php-dlya-nachinaushih. Там вы найдете все уроки, практические задания и дополнительные материалы.
Если у вас есть вопросы, не стесняйтесь задавать их в комментариях.