Объектно-ориентированное программирование: Классы и объекты
Студент освоит базовые концепции ООП, научится создавать классы и методы, а также использовать Constructor Property Promotion для сокращения кода.
Парадигма ООП и определение классов
До этого момента мы рассматривали процедурный подход. Однако современные приложения, включая фреймворк Laravel, на котором мы будем строить наш интернет-магазин, полностью базируются на Объектно-Ориентированном Программировании (ООП). ООП позволяет моделировать реальные сущности в виде программного кода. Класс — это чертеж или шаблон, а Объект — это конкретный экземпляр, созданный по этому чертежу. Например, класс Product описывает, какими свойствами обладает любой товар (ID, название, цена) и что он умеет делать (методы). Конкретный ноутбук MacBook Pro — это объект этого класса.
В ООП существуют три уровня доступа (модификаторы видимости), реализующие принцип инкапсуляции: public (доступно отовсюду), protected (доступно внутри класса и его наследников) и private (доступно только внутри самого класса). Инкапсуляция защищает данные от неконтролируемого изменения извне. В идеале свойства класса должны быть private или protected, а доступ к ним осуществляться через публичные методы (геттеры и сеттеры). Однако в современных версиях PHP, благодаря строгой типизации и readonly свойствам (PHP 8.1+), часто используются публичные свойства для простых объектов передачи данных (DTO).
Constructor Property Promotion (PHP 8)
В архивных материалах мы видим задачу на реализацию класса Product с использованием Constructor Property Promotion. До PHP 8, чтобы инициализировать свойства объекта при его создании, приходилось писать много шаблонного (boilerplate) кода: объявлять свойства, писать конструктор, принимать аргументы в конструктор и присваивать их свойствам ($this->name = $name;). PHP 8 представил 'Продвижение свойств конструктора' — синтаксический сахар, который позволяет объединить объявление свойства и его инициализацию прямо в сигнатуре конструктора.
Это кардинально сокращает объем кода и делает его более читаемым. Вы просто указываете модификатор доступа (например, public), тип и имя переменной прямо в круглых скобках функции __construct(). PHP автоматически создаст эти свойства в классе и присвоит им переданные значения. В этом же классе мы создадим метод getFormattedPrice(), демонстрирующий поведение объекта. В методах класса для обращения к свойствам текущего объекта используется псевдо-переменная $this.
<?php
// Реализация класса Product из архивных материалов
class Product {
// Constructor Property Promotion (PHP 8)
public function __construct(
public int $id,
public string $name,
public float $price
) {}
// Метод класса
public function getFormattedPrice(): string {
// Использование $this для доступа к свойству объекта
return '$' . number_format($this->price, 2);
}
}
// Создание экземпляра (объекта) класса
$laptop = new Product(1, 'Laptop', 1500.00);
echo $laptop->getFormattedPrice(); // Выведет: $1,500.00
Что означает псевдо-переменная $this в контексте ООП в PHP?
Какой магический метод вызывается автоматически при создании нового объекта с помощью ключевого слова new?
Задание
Применение Project-Based Learning: Создание элемента корзины.
- Создайте класс CartItem.
- Используя Constructor Property Promotion, добавьте публичные свойства: Product $product и int $quantity.
- Напишите метод getTotal(), который возвращает произведение цены товара на его количество.
- Проверьте работу, создав объект товара и передав его в CartItem.
| Термин ООП | Определение | Пример |
|---|---|---|
| Класс | Шаблон или чертеж | class Order { } |
| Объект | Конкретный экземпляр класса | $order = new Order(); |
| Инкапсуляция | Сокрытие внутренней реализации | private float $total; |
| Метод | Функция, принадлежащая классу | public function pay() { } |