Объектно-ориентированное программирование на PHP
Понимание классов, объектов, свойств и методов. Использование Constructor Property Promotion для лаконичного кода.
Мы переходим к самой важной парадигме современной разработки — Объектно-Ориентированному Программированию (ООП). Используя метод Mastery Learning, мы не двинемся дальше, пока вы не поймете разницу между классом и объектом. Представьте, что Класс — это чертеж автомобиля. На чертеже указано, что у машины есть цвет, двигатель и колеса. Но на чертеже нельзя ездить. Объект (или экземпляр) — это реальный автомобиль, сошедший с конвейера по этому чертежу: красная машина с мотором 2.0. В нашем интернет-магазине классом будет Product (Товар), а объектом — конкретный "iPhone 15" за $999. Классы содержат свойства (переменные внутри класса) и методы (функции внутри класса). До PHP 8 объявление свойств и их инициализация в конструкторе занимали много места. PHP 8 ввел Constructor Property Promotion — синтаксический сахар, позволяющий объявить свойства прямо в аргументах конструктора.
<?php
// Реализация класса Product с использованием Constructor Property Promotion (PHP 8)
class Product {
// Свойства объявляются и инициализируются прямо в конструкторе
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, 'MacBook Pro', 1999.99);
echo $laptop->name . " стоит " . $laptop->getFormattedPrice();
?>
Обратите внимание на ключевое слово $this. Оно используется внутри методов класса для обращения к свойствам именно текущего объекта. Если вы создадите два объекта: $laptop и $mouse, вызов $laptop->getFormattedPrice() возьмет цену ноутбука, потому что $this в тот момент указывает на объект ноутбука. Также мы использовали модификатор доступа public. Это значит, что свойства и методы доступны из любой части программы. В будущем мы изучим private (доступно только внутри класса) и protected (доступно в классе и его наследниках), что является основой принципа инкапсуляции — сокрытия внутренних деталей реализации от внешнего мира, чтобы случайно не сломать логику работы (например, не позволить напрямую изменить цену товара на отрицательную).
Задание
Сценарий: Создание корзины покупателя с использованием ООП.
- Создать класс Cart.
- Добавить приватное свойство $items (массив).
- Написать публичный метод addProduct(Product $product).
- Внутри метода добавить объект товара в массив $items через $this->items[] = $product;