Пример реализации полиморфизма 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 он тоже существует.

Написать этот пост побудила недавняя статья о полиморфизме. Она вызвала много споров, но знающие люди понимают, что автор написал скорее о наследовании и о переопределении методов, чем о полиморфизме. Не буду говорить ни хорошее ни плохое о той статье, а просто расскажу, что такое полиморфизм на самом деле. Дабы начинающие php-программисты не остались в заблуждении.

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

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

Я не буду углубляться непосредственно в сам полиморфизм и не стану писать о полиморфизме времени и компиляции. Будем ближе к теме данного блога, а именно к PHP.

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

Язык PHP поддерживает полиморфизм в том смысле, что позволяет использовать вместо экземпляров родительского класса экземпляры подкласса. Ввод в действие требуемого метода осуществляется на этапе прогона. Поддержка перегрузки методов, при которой ввод метода в действие осуществляется с учетом сигнатуры метода, отсутствует. Дело в том, что в каждом классе может присутствовать только один метод с определенным именем. Но благодаря тому, что в языке PHP применяется слабая типизация и поддерживается переменное количество параметров, появляется возможность обойти это ограничение. Если вам интересно, могу поделиться знаниями.

Пример полиморфизма в PHP

Возьмем за основу названия классов уже упоминавшейся статьи.
Нашим интерфейсом в данном случае будет абстрактный класс

abstract class Publication // определяем правило, что все публикации должны печататься, т.е. иметь метод do_print()
abstract public function do_print();
>

class News extends Publication // переопределяем абстрактный метод печати
public function do_print() echo ‘

Новость

‘ ;
//.
>
>
class Announcement extends Publication // переопределяем абстрактный метод печати
public function do_print() echo ‘

Объявление

‘ ;
//.
>
>
class Article extends Publication // переопределяем абстрактный метод печати
public function do_print() echo ‘

Статья

‘ ;
//.
>
>

//Наполняем массив публикаций объектами, производными от Publication
$publications[] = new News();
$publications[] = new Announcement();
$publications[] = new Article();

foreach ($publications as $publication) if ($publication instanceof Publication) < // Если мы работаем с наследниками Publication
$publication->do_print(); // то мы можем смело выводить данные на печать
>
else //исключение или обработка ошибки
>
>

Главное здесь — последняя часть. Именно в ней заключается суть полиморфизма. Мы используем один и тот же код для объектов разных классов.
Теперь о том, как это можно применять на практике. Допустим, пользователь хочет отследить последние обновления публикаций, причем ему не важно, будут это статьи или новости или что-то еще.
С учетом того, что таблицы разные, поля в них тоже разные, удобнее всего получить отдельные списки для новостей и для статей. Но мы не можем их выводить отдельно — пользователю интересна временная последовательность. Поэтому мы сортируем данные, формируя, один большой массив объектов. Ну а далее, как и в примере выше, мы можем в рамках одного интерфейса вывести все объекты. Но при этом на экран новости и статьи будут выводиться немного по разному, например с разной иконкой или различным началом заголовка. Таким образом нам не нужно делать никаких проверок на предмет того, с чем мы работаем. Интерпретатор сделает это за нас.

Надеюсь теперь тема полиморфизма стала более понятной. Как отмечалось выше, если будет интересно, могу написать о переопределении методов, при котором ввод метода в действие осуществляется с учетом сигнатуры. Обращайтесь.

Источник

Читайте также:  Hlebopechka ru index php option
Оцените статью