Курс — «Программирование на PHP8 для начинающих» — #14 Объектно-ориентированное программирование. Наследование и полиморфизм
Здравствуйте, дорогие друзья.
Наследование и полиморфизм — это ключевые концепции объектно-ориентированного программирования (ООП), которые позволяют создавать гибкие и повторно используемые кодовые структуры. В этом разделе мы рассмотрим, как реализовать наследование и полиморфизм в PHP.
Наследование
Наследование позволяет создавать новые классы на основе существующих. Новый класс (подкласс или производный класс) наследует свойства и методы базового класса (суперкласса или родительского класса). Это позволяет повторно использовать код и расширять функциональность существующих классов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php class Animal { public $name; public function __construct($name) { $this->name = $name; } public function makeSound() { echo $this->name . " makes a sound."; } } class Dog extends Animal { public function makeSound() { echo $this->name . " barks."; } } class Cat extends Animal { public function makeSound() { echo $this->name . " meows."; } } $dog = new Dog("Buddy"); $dog->makeSound(); // Вывод: Buddy barks. $cat = new Cat("Whiskers"); $cat->makeSound(); // Вывод: Whiskers meows. ?> |
Полиморфизм
Полиморфизм позволяет объектам разных классов быть обработанными как объекты общего суперкласса. Это означает, что один и тот же метод может работать с объектами разных классов, если эти классы наследуют общий интерфейс или базовый класс.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php class Animal { public $name; public function __construct($name) { $this->name = $name; } public function makeSound() { echo $this->name . " makes a sound."; } } class Dog extends Animal { public function makeSound() { echo $this->name . " barks."; } } class Cat extends Animal { public function makeSound() { echo $this->name . " meows."; } } function makeAnimalSound(Animal $animal) { $animal->makeSound(); } $dog = new Dog("Buddy"); $cat = new Cat("Whiskers"); makeAnimalSound($dog); // Вывод: Buddy barks. makeAnimalSound($cat); // Вывод: Whiskers meows. ?> |
Абстрактные классы и методы
Абстрактные классы и методы позволяют определять общие интерфейсы, которые должны быть реализованы в подклассах. Абстрактный класс не может быть создан напрямую, и абстрактные методы должны быть реализованы в подклассах.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<?php abstract class Shape { abstract public function getArea(); abstract public function getPerimeter(); } class Rectangle extends Shape { private $width; private $height; public function __construct($width, $height) { $this->width = $width; $this->height = $height; } public function getArea() { return $this->width * $this->height; } public function getPerimeter() { return 2 * ($this->width + $this->height); } } class Circle extends Shape { private $radius; public function __construct($radius) { $this->radius = $radius; } public function getArea() { return pi() * $this->radius * $this->radius; } public function getPerimeter() { return 2 * pi() * $this->radius; } } $rectangle = new Rectangle(5, 3); echo "Rectangle Area: " . $rectangle->getArea() . "\n"; // Вывод: Rectangle Area: 15 echo "Rectangle Perimeter: " . $rectangle->getPerimeter() . "\n"; // Вывод: Rectangle Perimeter: 16 $circle = new Circle(4); echo "Circle Area: " . $circle->getArea() . "\n"; // Вывод: Circle Area: 50.26548245743669 echo "Circle Perimeter: " . $circle->getPerimeter() . "\n"; // Вывод: Circle Perimeter: 25.132741228718345 ?> |
Интерфейсы
Интерфейсы позволяют определять набор методов, которые должны быть реализованы в классах. Это позволяет создавать гибкие и переиспользуемые компоненты, которые могут быть легко заменены.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php interface Logger { public function log($message); } class FileLogger implements Logger { public function log($message) { // Логирование в файл file_put_contents('log.txt', $message . PHP_EOL, FILE_APPEND); } } class DatabaseLogger implements Logger { public function log($message) { // Логирование в базу данных // Предположим, что у нас есть функция для записи в базу данных // database_log($message); } } function logMessage(Logger $logger, $message) { $logger->log($message); } $fileLogger = new FileLogger(); $databaseLogger = new DatabaseLogger(); logMessage($fileLogger, "This is a log message."); logMessage($databaseLogger, "This is another log message."); ?> |
Пример использования наследования и полиморфизма:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
<?php // Определение базового класса Vehicle abstract class Vehicle { protected $make; protected $model; public function __construct($make, $model) { $this->make = $make; $this->model = $model; } abstract public function startEngine(); abstract public function stopEngine(); public function getDetails() { return "Make: " . $this->make . ", Model: " . $this->model; } } // Определение подкласса Car class Car extends Vehicle { public function startEngine() { echo "Car engine started.\n"; } public function stopEngine() { echo "Car engine stopped.\n"; } } // Определение подкласса Motorcycle class Motorcycle extends Vehicle { public function startEngine() { echo "Motorcycle engine started.\n"; } public function stopEngine() { echo "Motorcycle engine stopped.\n"; } } // Функция для работы с объектами Vehicle function operateVehicle(Vehicle $vehicle) { $vehicle->startEngine(); echo $vehicle->getDetails() . "\n"; $vehicle->stopEngine(); } // Создание объектов Car и Motorcycle $car = new Car("Toyota", "Corolla"); $motorcycle = new Motorcycle("Honda", "CBR"); // Использование полиморфизма operateVehicle($car); // Вывод: // Car engine started. // Make: Toyota, Model: Corolla // Car engine stopped. operateVehicle($motorcycle); // Вывод: // Motorcycle engine started. // Make: Honda, Model: CBR // Motorcycle engine stopped. ?> |
Наследование и полиморфизм являются мощными инструментами в объектно-ориентированном программировании, которые позволяют создавать гибкие и повторно используемые компоненты. Они способствуют улучшению структуры кода, его поддерживаемости и расширяемости.
На этом все. Всем хорошего дня!
Цикл статей по курсу — «Программирование на PHP8 для начинающих».