Языки программирования

Полиморфизм классов в PHP

Продолжаем изучать классы и сегодня мы поговорим о полиморфизме классов в php.
Полиморфизм — это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом данных.
В более общем смысле, концепцией полиморфизма является идея «один интерфейс, множество методов». Это означает, что можно создать общий интерфейс для группы близких по смыслу действий. Преимуществом полиморфизма является то, что он помогает cнижать сложность программ, разрешая использование того же интерфейса для задания единого класса действий. Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор. Вам, как программисту, не нужно делать этот выбор самому. Нужно только помнить и использовать общий интерфейс.
Полиморфность класса — это свойство базового класса использовать функции производных классов, даже если на момент определения еще неизвестно, какой именно класс будет включать его в качестве базового и, тем самым, становиться от него производным.

Интерфейс

Интерфейс – то же самое, что и класс, за исключением того, что он не может содержать код. Интерфейс может определять названия методов и аргументов, но не содержание методов. Любые классы, реализующие интерфейс, должны реализовывать все методы, определяемые интерфейсом. Класс может реализовать множественные интерфейсы.
Общий интерфейс – неотъемлемая часть полиморфизма. Определить интерфейс в PHP можно двумя способами: interfaces и abstract classes. Оба имеют свою область применения, и их можно смешивать и сочетать для подгонки в свою иерархию классов.
Интерфейс объявляется ключевым словом «interface»:
interface MyInterface { 

// methods 

}
Присоединить к классу интерфейс можно с помощью ключевое слово «implements»:
class MyClass implements MyInterface { 

// methods 

} 
Методы в интерфейсе можно определять так же, как в классе, за исключением того, что они не могут иметь содержимого:
interface MyInterface { 

public function doThis(); 

public function doThat(); 

public function setName($name); 

} 

Абстрактный класс

Абстрактный класс – это смесь интерфейса и класса. Он может определять как функциональность, так и интерфейс. Классы, расширяющие абстрактный класс должны реализовывать все абстрактные методы, определенные в абстрактном классе.
Абстрактный класс объявляется таким же образом, как и классы, но с добавлением ключевого слова «abstract»:
abstract class MyAbstract { 

// methods 

}
Абстрактный класс можно назначить к классу используя ключевое слово «extends»:
class MyClass extends MyAbstract { 

// class methods 

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

class News extends Publication {
 // переопределяем абстрактный метод печати
 public function do_print() {
  echo '<h4<Новость</h4<';
  //...
 }
}
class Announcement extends Publication {
 // переопределяем абстрактный метод печати
 public function do_print() {
  echo '<h4<Объявление</h4<';
  //...
 }
}
class Article extends Publication {
 // переопределяем абстрактный метод печати
 public function do_print() {
  echo '<h4<Статья</h4<';
  //...
 }
}

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

foreach ($publications as $publication) {
 if ($publication instanceof Publication) { // Если мы работаем с наследниками Publication
  $publication->do_print(); // то мы можем смело выводить данные на печать
 }
 else {
  //исключение или обработка ошибки
 }
}
Вся суть полиморфизма заключаеться в последей части кода.

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

На этом наш урок закончен, на следующем занятии мы поговорим о инкапсуляции в php.
Самоучитель по PHP