Урок 34: ООП в PHP (классы и объекты для начинающих)

На 34-м уроке мы с вами погрузимся в одну из интересных тем в программировании, это объектно-ориентированное программирование (ООП). Если вы дошли до этого урока, то уже знаете основы PHP, умеете работать с переменными, функциями, массивами и циклами. Теперь пришло время сделать следующий шаг и освоить ООП, которое позволит вам писать более структурированный, гибкий и поддерживаемый код.

Введение в объектно-ориентированное программирование

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

Основные принципы ООП:

  1. Инкапсуляция — сокрытие внутренней реализации объекта и предоставление только необходимого интерфейса для взаимодействия с ним.
  2. Наследование — возможность создания новых классов на основе существующих, что позволяет повторно использовать код.
  3. Полиморфизм — возможность объектов с одинаковым интерфейсом иметь разную реализацию.
  4. Абстракция — выделение главных характеристик объекта и игнорирование второстепенных.

ООП делает код более модульным, что упрощает его поддержку и расширение. Давайте разберем, как это работает в PHP.

Создание классов и объектов

Что такое класс?

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

Пример простого класса:

class Car {
    // Свойства класса
    public $brand;
    public $model;
    public $year;

    // Метод класса
    public function startEngine() {
        return "Двигатель автомобиля {$this->brand} {$this->model} запущен!";
    }
}

Здесь мы создали класс Car, который имеет три свойства: brandmodel и 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 для этого используются модификаторы доступа: publicprotected и 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 запущен!

Здесь свойства brandmodel и year являются приватными, и доступ к ним возможен только через публичные методы getBrandgetModel и getYear.

Практические задачи

  1. Создание класса «Книга».
    Создайте класс Book, который будет иметь свойства titleauthor и year. Добавьте метод getInfo, который возвращает строку с информацией о книге. Создайте объект этого класса и выведите информацию о книге.
  2. Инкапсуляция: класс «Банковский счет».
    Создайте класс 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. Там вы найдете все уроки, практические задания и дополнительные материалы.

Если у вас есть вопросы, не стесняйтесь задавать их в комментариях.