Полиморфизм ооп пример php

PHP Polymorphism

Summary: in this tutorial, you will learn about the polymorphism concept in object-oriented programming. And you’ll also learn how to implement polymorphism in PHP using abstract classes or interfaces.

What is polymorphism?

Polymorphism is a Greek word that literally means many forms. In object-oriented programming, polymorphism is closely related to inheritance.

Polymorphism allows objects of different classes to respond differently based on the same message.

To implement polymorphism in PHP, you can use either abstract classes or interfaces.

Polymorphism helps you create a generic framework that takes the different object types that share the same interface.

Later, when you add a new object type to the system, you don’t need to change the framework to accommodate the new object type as long as it implements the same interface.

By using polymorphism, you can reduce coupling and increase code reusability.

PHP polymorphism using an abstract class

First, define an abstract class named Person that has an abstract method called greet() .

 abstract class Person < abstract public function greet(); >Code language: HTML, XML (xml)

Second, define the English , German , and French classes that extend the Person class. The greet() method of each class returns a different greeting message.

 // . class English extends Person < public function greet() < return 'Hello!'; > > class German extends Person < public function greet() < return 'Hallo!'; > > class French extends Person < public function greet() < return 'Bonjour!'; > >Code language: HTML, XML (xml)

Third, define a function called greeting() that accepts an array of Person objects and calls the greet() method of each object:

 //. function greeting($people) < foreach ($people as $person) < echo $person->greet() . '
'
; > >
Code language: HTML, XML (xml)

Fourth, define an array of objects of the English , German , and French classes and pass it to the greeting() function:

 //. $people = [ new English(), new German(), new French() ]; greeting($people);Code language: HTML, XML (xml)

Due to the specific implementation of the greet() method in each class, these objects return different greeting messages.

The following class diagram illustrates the relationships between the classes:

Later, if you want to create a new class that extends the Person class, you don’t need to change the greeting() function.

For example, you can define a new class called American that extends the Person class:

 // . class American extends Person < public function greet() < return 'Hi!'; > >Code language: HTML, XML (xml)

And use the object of the American class in the greeting() function as follows:

  // . $people = [ new English(), new German(), new French(), new American() ]; greeting($people);Code language: HTML, XML (xml)

PHP polymorphism using an interface

The following example is the same as the above except that it uses an interface instead of an abstract class.

First, define an interface called Greeting that has the greet() method. The greet() method returns a greeting message:

 interface Greeting < public function greet(); >Code language: HTML, XML (xml)

Second, define the English , German , and French classes that implement the Greeting interface:

  // . class English implements Greeting < public function greet() < return 'Hello!'; > > class German implements Greeting < public function greet() < return 'Hallo!'; > > class French implements Greeting < public function greet() < return 'Bonjour!'; > >Code language: HTML, XML (xml)

Third, define the greeting() function that accepts an array of objects that implements the Greeting interface:

 // . function greeting($greeters) < foreach ($greeters as $greeter) < echo $greeter->greet() . '
'
; > >
Code language: HTML, XML (xml)

Finally, define an array of the Greeting objects and pass it to the greeting() function:

  // . $greeters = [ new English(), new German(), new French(), ]; greeting($greeters);Code language: HTML, XML (xml)

The following class diagram shows the relationships between the interface and classes:

Summary

  • Polymorphism allows objects of different classes to respond differently to the same message.
  • Use interfaces or abstract classes to implement polymorphism in PHP.

Источник

Полиморфизм в ООП на PHP

В этом уроке мы узнаем о « полиморфизме» (греч. «Множество форм») — соглашении об именах, которое может помочь нам написать код, который будет намного более последовательным и простым в использовании. Согласно принципу полиморфизма, методы в разных классах, которые делают похожие вещи, должны иметь одно и то же имя.

Что такое полиформизм?

Полиморфизм — это, по сути, шаблон ООП, который позволяет множеству классов с разными функциями выполнять или совместно использовать общий интерфейс.

В мире программирования полиморфизм используется для того, чтобы сделать приложения более модульными и расширяемыми. Вместо беспорядочных условных утверждений, описывающих различные варианты действий, вы создаете взаимозаменяемые объекты, которые выбираете в зависимости от ваших потребностей. Это основная цель полиморфизма.

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

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

Как реализовать принцип полиморфизма?

Чтобы реализовать принцип полиморфизма, мы можем выбирать между абстрактными классами и интерфейсами.

В приведенном ниже примере интерфейс с именем Shape фиксирует все классы, реализующие его, для определения абстрактного метода с именем calcArea() :

Пример

Соответственно, класс Circle реализует интерфейс, помещая в метод calcArea() формулу, вычисляющую площадь кругов:

Пример

 radius = $radius; > // calcArea вычисляет площадь круга public function calcArea() < return $this ->radius * $this -> radius * pi(); > > ?>

Класс Rectangle также реализует интерфейс Shape , но определяет метод

с формулой вычисления, которая подходит для прямоугольников:

Пример

 width = $width; $this -> height = $height; > // calcArea вычисляет площадь прямоугольников public function calcArea() < return $this ->width * $this -> height; > > ?>

Теперь мы можем создавать объекты из конкретных классов:

Пример

Мы можем быть уверены, что все объекты вычисляют площадь с помощью метода calcArea() , будь то прямоугольный объект или круговой объект (или любая другая форма), если они реализуют интерфейс Shape .

Теперь мы можем использовать методы calcArea() для вычисления площади фигур:

Пример

 class Circle implements Shape < private $radius; public function __construct($radius) < $this ->radius = $radius; > // calcArea вычисляет площадь круга public function calcArea() < return $this ->radius * $this -> radius * pi(); > > class Rectangle implements Shape < private $width; private $height; public function __construct($width, $height) < $this ->width = $width; $this -> height = $height; > // calcArea вычисляет площадь прямоугольников public function calcArea() < return $this ->width * $this -> height; > > $circ = new Circle(3); $rect = new Rectangle(3,4); echo $circ -> calcArea(); echo $rect -> calcArea(); ?>

Результат выполнения кода:

Вывод

В этом уроке мы узнали, как реализовать принцип полиморфизма в PHP. Кликните здесь, чтобы попрактиковаться в предмете.

Источник

Полиморфизм в PHP

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

Однако перед этим давайте вспомним конструкцию instanceof. Она позволяет узнать, является ли объект экземпляром какого-то класса, либо что он реализует какой-либо интерфейс. Возвращает true или false.

class A < public function sayHello() < return 'Hello, I am A'; >> $a = new A(); var_dump($a instanceof A); // true

Давайте создадим ещё один класс, который будет наследником класса A, и выполним ту же проверку для объекта этого класса.

class B extends A < >$b = new B(); var_dump($b instanceof B); // true

При этом если проверить объект дочернего класса, является ли он объектом родительского класса, то мы получим true.

class B extends A < >$b = new B(); var_dump($b instanceof A); // тоже true!

Это правило работает только в одну сторону, объекты родительского класса не будут являться экземплярами дочернего.

class A < public function sayHello() < return 'Hello, I am A'; >> class B extends A < >$a = new A(); $b = new B(); var_dump($a instanceof B); // false

Согласитесь, это вполне логично.

Таким образом объекты дочерних классов будут проходить проверку на то, что они являются экземплярами родительских классов.

Как мы помним, методы объектов родительских классов у нас доступны и в дочерних – они наследуются. Соответственно мы можем быть уверены, что эти же методы есть и у дочерних объектов. Конкретно в нашем примере – у объектов класса B будет метод sayHello(), унаследованный от A.

Или в примере с интерфейсами из прошлого урока – мы определили, что объекты, реализовавшие какой-то интерфейс обязательно будут иметь метод с определённым набором параметров. То есть мы можем рассчитывать на то, что этот метод у объекта гарантированно есть и мы можем его вызвать.

Благодаря этому свойству объектов мы можем ожидать от них какого-то определенного поведения, если они являются объектами какого-то класса или реализуют какой-то интерфейс.

Это свойство, благодаря которому мы можем зависеть не от конкретной реализации (проще говоря конкретного класса), а от абстракции (интерфейса), и есть – полиморфизм.

Да-да, в примере про вычисление площадей фигур мы уже сталкивались с полиморфизмом! В тот момент, когда мы проверяли, имеется ли у объекта интерфейс для вычисления площади, мы работали с проявлением полиморфизма.

Переопределение методов

Как мы уже сказали, в дочерних объектах доступны методы объектов родительского класса.

class A < public function sayHello() < return 'Hello, I am A'; >> class B extends A < >$b = new B(); echo $b->sayHello(); // Hello, I am A

Однако, мы можем переопределить этот метод в классе B. Для этого мы описываем метод с таким же названием и описываем в нём свою логику:

class A < public function sayHello() < return 'Hello, I am A'; >> class B extends A < public function sayHello() < return 'Hello, I am B'; >> $b = new B(); echo $b->sayHello(); // 'Hello, I am B

Мы также можем вызвать родительский метод в дочернем при помощи слова parent и двойного двоеточия.

 > class B extends A < public function sayHello() < return parent::sayHello() . '. It was joke, I am B :)'; >> $b = new B(); echo $b->sayHello(); // Hello, I am A. It was joke, I am B :)

Мы вызвали родительский метод, и дополнили его функционал. Так часто приходится делать в реальных проектах. Буквально через пару уроков вы столкнетесь с более понятными примерами того, для чего всё это нужно. Но пока что мы должны изучить базу на немного искусственных примерах. К сожалению, придумать что-то более интересное я не смог.

И ещё один примерчик, тоже искуственный.

class A < public function method1() < return $this->method2(); > protected function method2() < return 'A'; >> class B extends A < protected function method2() < return 'B'; >> $b = new B(); echo $b->method1();

Как думаете, что выведет этот код?

Не знаю, что вы ответили, но он в любом случае выведет B. Внутри метода method1() будет вызван тот метод method2(), который определён для класса, в котором его выполняют. То есть $this не привязан напрямую к классу A. Когда мы вызываем method1() у экземпляра класса B, то $this внутри него будет связан с классом B, и вызовется метод method2(), определенный именно в классе B.

И это – тоже полиморфизм. $this привязывается к объекту, в котором код выполняется, а не там, где он был описан.

На этом с полиморфизмом пока всё, если что-то непонятно – пишите в комментах.

Источник

Читайте также:  Round to integer in javascript
Оцените статью