PHP: полиморфизм и инкапсуляция

Автор: Aport Четверг, Январь 29th, 2015 Нет комментариев

Рубрика: Разное

Решил написать краткую напоминалку себе и другим, а то в просторах инета любят расписывать замудрено.

Честно говоря, проще всего эти понятия расписаны тут, но если Вам этого мало, то читайте ниже.

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

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

Пример полиморфизма в 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

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

В программном смысле этого слова, инкапсуляция - это скрытие переменных в классе от пользователя. Т.е. все переменные (свойства) класса Вы делаете скрытыми (private), а методы открытыми (public). Т.е. можно будет взаимодействовать со свойствами класса через методы.
Прелесть данного подхода в том, что в методах можна вставить код для проверки всяких ошибок, и потом о них не думать, когда вызывается метод.

 

Источник: yapro.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты