Итоги — Калькулятор фигур
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 32 из 91.
Задание
ЛегкоДавайте создадим калькулятор фигур, который демонстрирует мощь интерфейсов для создания гибкого и расширяемого кода. Вы создадите интерфейс, определяющий контракт для вычисления площади, а затем реализуете его в различных классах фигур.
Вы организуете свой код в четырех файлах:
Calculable.php— Определите интерфейсCalculableс одной сигнатурой метода:calculateArea(). Этот контракт гарантирует, что любая вычисляемая фигура может рассчитать свою площадь.Rectangle.php— Создайте классRectangle, который реализуетCalculable. Подключите файл интерфейса. Класс должен иметь приватные свойства$widthи$height, устанавливаемые через конструктор. РеализуйтеcalculateArea(), чтобы возвращать площадь (ширина, умноженная на высоту).Circle.php— Создайте классCircle, который также реализуетCalculable. Подключите файл интерфейса. Класс должен иметь приватное свойство$radius, устанавливаемое через конструктор. РеализуйтеcalculateArea(), чтобы возвращать площадь по формулеpi() * radius * radius.main.php— Подключите оба файла фигур. Создайте функцию с именемdisplayArea, которая принимает параметр типаCalculableи имя фигуры (string). Функция должна выводить:"[name] area: [area]", где площадь округлена до 2 знаков после запятой с помощьюnumber_format().
Вы получите четыре входных значения: ширину прямоугольника, высоту прямоугольника, радиус круга и имя фигуры для круга. Создайте Rectangle с шириной и высотой (преобразуйте в числа с плавающей точкой) и Circle с радиусом (преобразуйте в число с плавающей точкой). Вызовите displayArea() дважды — сначала для прямоугольника, используя "Rectangle" в качестве имени, затем для круга, используя предоставленное имя фигуры. Выведите каждый результат на новой строке.
Функция displayArea() работает с любой фигурой, реализующей Calculable — ей не нужно знать, вычисляет ли она площадь прямоугольника, круга или любой другой фигуры, которую вы добавите в будущем. В этом и заключается прелесть программирования через интерфейс!
Попробуйте сами
<?php
// Подключите файлы фигур
require_once 'Rectangle.php';
require_once 'Circle.php';
// TODO: Создайте функцию с названием displayArea
// Она должна принимать параметр типа Calculable и название фигуры (строку)
// Вывод: "[name] area: [area]", где площадь округлена до 2 знаков после запятой с помощью number_format()
// Чтение входных данных
$width = floatval(trim(fgets(STDIN)));
$height = floatval(trim(fgets(STDIN)));
$radius = floatval(trim(fgets(STDIN)));
$circleName = trim(fgets(STDIN));
// TODO: Создайте объект Rectangle с указанной шириной и высотой
// TODO: Создайте объект Circle с указанным радиусом
// TODO: Вызовите displayArea() для прямоугольника, используя "Rectangle" в качестве названия
// TODO: Вызовите displayArea() для круга, используя предоставленное название фигуры
?>Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy