Введение в шаблоны проектирования в PHP

Опубликовано: 2020-04-14

Шаблоны проектирования PHP оказались чрезвычайно полезными для разработчиков и решают основные проблемы. Чтобы писать эффективный код, разработчики должны следовать лучшим практикам. Шаблоны проектирования PHP - это концепция объектно-ориентированного программирования (ООП), которая теперь также используется в проектах Drupal 8. Благодаря тому, что Drupal 8 использует современные концепции PHP и ООП, можно использовать шаблоны проектирования для более чистого и надежного программирования.

Шаблоны проектирования в PHP

Что такое шаблоны проектирования в PHP?

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

Преимущества использования шаблонов проектирования PHP

Основные преимущества шаблонов проектирования в PHP:

  • Паттерны PHP Design помогают в решении повторяющихся проблем, возникающих во время разработки.
  • Использование шаблонов проектирования в PHP делает взаимодействие между дизайнерами более эффективным.
  • Другим разработчикам, которые смотрят на ваш код, не придется изо всех сил понимать, поскольку код хорошо структурирован с использованием шаблонов проектирования.
  • Следование передовым практикам помогает создавать более надежное программное обеспечение
  • Это помогает ускорить и упростить разработку

Широко используемые шаблоны проектирования в PHP

Шаблоны проектирования можно использовать в различных ситуациях для решения схожих проблем. Существует около 23 паттернов дизайна, которые можно условно разделить на три типа паттернов проектирования - творческие, структурные и поведенческие.

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

Структурные шаблоны: это упрощает дизайн, определяя простые способы реализации взаимосвязей между объектами.

Поведенческие шаблоны: они используются для управления отношениями, обязанностями и алгоритмами между объектами.

Заводской образец

Заводской шаблон используется для создания объекта. Правильно - строить объект, а не создавать объект. Когда мы строим объект, мы сначала создаем его, а затем инициализируем. Обычно это требует применения определенной логики и выполнения нескольких шагов. При этом имеет смысл собрать все это в одном месте и повторно использовать его всякий раз, когда вам нужно создать новый объект таким же образом. По сути, это использование фабричного паттерна.
Отличная идея - иметь интерфейс для нашей фабрики и полагаться на него, а не на конкретную фабрику.

 интерфейс FamilyFactoryInterface {
    общественный функция create (): Семья
}

Затем реализуйте фабричный интерфейс со следующим классом:

класс СемьяФабрика орудия FamilyFactoryInterface {

общественный функция create (): Family {

$ family = новая семья ();

// инициализируем вашу семью

вернуть $ family;

}

}

Шаблон адаптера

В Адаптере Design Pattern, класс преобразует интерфейс одного класса к другому класса этого примеру у нас есть класс учебника , который имеет GetTitle () и getAuthor () методу. Клиент ожидает использования метода getTitleAndAuthor (). Чтобы «адаптировать» SimpleBook к demoAdapter, у нас есть класс адаптера BookAdapter , который принимает экземпляр TextBook и использует методы TextBook getTitle () и getAuthor () в своем собственном методе getTitleAndAuthor.

<? php

класс TextBook {

частный $ title;
частный автор $;
функция __construct ($ title_in, $ author_in) {
$ this -> title = $ title_in;

$ this -> author = $ author_in;
}

функция getTitle () {
возвращение $ this -> название;
}
функция getAuthor () {
возвращение $ this -> автор;
}
}

класс BookAdapter {
личная книга $;
функция __construct (Учебник $ book_in) {
$ this -> book = $ book_in;
}
функция getTitleAndAuthors () {
возвращение $ это -> книга-> getTitle (). "по" . $ это -> книга-> getAuthor ();
}
}

// клиент

Writeln ( 'НАЧАТЬ ТЕСТИРОВАНИЕ ШАБЛОНА АДАПТЕРА' );
Writeln ( '' );

$ book = new TextBook ( «Гамма, Хельм, Джонсон и Влиссидес» , «Шаблоны дизайна» );
$ bookAdapter = новый BookAdapter ($ book);
Writeln ( 'Автор и название:' . $ bookAdapter-> getTitleAndAuthor ());
Writeln ( '' );

Writeln ( 'КОНЕЦ ТЕСТИРОВАНИЯ ШАБЛОНА АДАПТЕРА' );

функция Writeln ($ line_in) {
эхо $ line_in. «<br/>» ;
}

?>

Шаблон синглтона PHP

Чтобы ограничить создание экземпляра класса одним объектом, в PHP используется одноэлементный шаблон. Это может быть полезно, когда в системе требуется только один объект. При разработке веб-приложений имеет смысл разрешить доступ только к одному экземпляру определенного класса. Чтобы предотвратить явное создание объектов из класса шаблона Singleton, используется частный конструктор.

<? php
класс Синглтон
{
общественный статический функция getInstance ()
{
статический $ instance = null ;
if ( null === $ instance) {
$ instance = new статический ();
}
return $ instance;
}
защищенный функция __construct ()
{
}
частный функция __clone ()
{
}
частный функция __wakeup ()
{
}
}
класс Синглтон расширяет Синглтон
{
}
$ obj = Синглтон :: getInstance ();
var_dump ($ obj === Singleton :: getInstance ());
$ obj2 = SingletonChild :: getInstance ();
var_dump ($ obj2 === Singleton :: getInstance ());
var_dump ($ obj2 === SingletonChild :: getInstance ());
?>

Шаблон наблюдателя в PHP

Паттерн PHP Observer используется для предупреждения остальной системы об определенных событиях в определенных местах.
Например, если нам нужно создать Театр, чтобы показывать фильмы критикам. Мы определяем класс Theater с помощью текущего метода. Перед тем, как представить фильм, мы хотим разослать сообщения на мобильные телефоны критиков. Затем, в середине фильма, мы хотим остановить фильм на 5 минут, чтобы дать критикам перерыв. Наконец, после окончания фильма мы хотим попросить критиков оставить свой отзыв. Итак, в шаблоне наблюдателя для PHP объект наблюдателя получает уведомление только при изменении статуса.

Вот как выглядит код -

класс Theater {

общественный функция current (Movie $ movie): void {

$ критики = $ фильм-> getCritics ();
$ this -> сообщение-> отправить ($ критики, '...' );

$ фильм-> играть ();

$ фильм-> пауза ( 5 );
$ this -> прогресс-> интервал ($ критики)
$ фильм-> конец ();

$ this -> ответ-> запрос ($ критики);
}
}

Шаблон декоратора для PHP

Шаблон декоратора используется, когда вы хотите изменить характер объекта во время выполнения и тем самым уменьшить ненужные наследования и количество классов. Что ж, это можно объяснить на примерах. Допустим, у нас есть классы «Диван» и «Кровать», и оба они реализуют SleeperInterface.

интерфейс SleeprInterface {
общественный функция sleep (): пусто;
}
класс Диван орудия SleeperInterface {
общественный функция sleep (): void {
// спит на диване
}
}
класс Кровать орудия SleeperInterface {
общественный функция sleep (): void {
// спит на кровати
}
}

И диваны, и кровати ведут себя одинаково во время сна. Теперь нам нужны другие диваны и кровати с дополнительными функциями, которые будут сообщать пользователям об отслеживании сна, когда они спят на диванах или кроватях. С помощью наследования мы можем решить эту проблему следующим образом:

класс SmartSofa расширяет Диван {
публичная функция sleep (): void {
родитель :: сон ();
$ this -> sleepHours ();
}
}
класс SmartBed расширяет Window {
публичная функция sleep (): void {
родитель :: сон ();
$ this -> sleepHours ();
}
}

Всего у нас 4 класса. Однако решить эту проблему с 3-мя классами мы смогли только с помощью шаблона Decorator. Вот как:

класс SmartSleeper орудия SleeperInterface {

частный спящий $;
общественный функция __construct (SleeperInterface $ sleeper) {
$ this -> спящий = $ спящий;
}

общественный функция sleep (): void {
$ это -> спящий-> сон ();
$ this -> sleepHours ();
}
}
$ диван = новый диван ();
$ bed = новая кровать ();
$ smartSofa = новый SmartSleeper ($ диван);
$ smartBed = новый SmartSleeper ($ кровать);

Здесь мы представили новый тип спящего, который действует как прокси, но с дополнительными функциями поверх него.

Использование шаблонов дизайна в Drupal 8

Хотя существует множество шаблонов проектирования, уже установленных в Drupal до Drupal 8, теперь Drupal 8 состоит из множества шаблонов, которые ранее были недоступны. Некоторые из этих новых шаблонов полностью заменяют некоторые старые, в то время как другие вводят некоторые новые функции в Drupal 8.

Шаблоны проектирования, используемые в Drupal 8, включают:

  • Шаблон объектно-ориентированного программирования (ООП)
  • Инъекции зависимостей
  • Заводской образец
  • Шаблон Singleton

ООП - это на самом деле не единый шаблон, а полностью радикальный способ концептуализации и структурирования кода, который выходит далеко за рамки простых шаблонов проектирования. Это основа для многих популярных шаблонов проектирования программного обеспечения, используемых сегодня, включая те, которые используются в Drupal 8. Он был представлен в Drupal 7, но широко не использовался и не требовался. В Drupal 8 сейчас другая ситуация, он широко используется, и он необходим.

Внедрение зависимости

Внедрение зависимостей - это шаблон проектирования программного обеспечения, который позволит вам удалить жестко запрограммированные зависимости, а также даст возможность изменять их во время выполнения или во время компиляции. Добавить инъекцию зависимостей легко, и она не вмешивается в ваш существующий код. Drupal 8 представил концепцию сервисов, чтобы отделить многоразовые функции. core.services.yml - это пример внедрения зависимостей в Drupal 8. Мы уже обсуждали Factory Pattern и Singleton Pattern в PHP выше.