Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Диспетчеризация по ключу (данные) PHP: Полиморфизм

В связке с полиморфизмом постоянно возникает выражение "динамическая диспетчеризация". С самим понятием мы познакомимся позже, а сейчас поговорим про диспетчеризацию в принципе.

Диспетчеризация (от английского dispatch - отсылать, отправлять) - процесс координации каких-либо действий. Например, диспетчер в аэропорту разводит самолёты, диспетчер в службе такси связывает доступного водителя и клиента.

Рассмотрим условный код, в котором выбор ветки исполнения идёт по конкретному значению переменной:

<?php

if ($env === 'development') {
    $databaseConfiguration = [
        'adapter' => 'sqlite',
    ];
} else if ($env === 'production') {
    $databaseConfiguration = [
        'adapter' => 'postgresql',
    ];
}

Во всех проектах существует понятие "среда", это то окружение, в котором происходит запуск проекта. Во время разработки код запускают в среде разработчика, её традиционно называют development. Среда, в которой приложение работает по-настоящему, называется production. В зависимости от среды, приложения по разному стартуют, конфигурируются и даже работают, например в разных средах могут использоваться разные базы данных.

Код выше как раз типичный пример того, как меняется конфигурация в зависимости от среды. Процесс выбора можно назвать процессом диспетчеризации.

Статичная условная конструкция, в которой диспетчеризация идёт по строкам, легко заменяется на свитч. Так код становится понятнее и проще:

<?php

switch ($env) {
    case 'development':
        $databaseConfiguration = [
            'adapter' => 'sqlite',
        ];
        break;
    case 'production':
        $databaseConfiguration = [
            'adapter' => 'postgresql',
        ];
        break;
}

Хотя кода и стало чуть больше, switch сам по себе более явно описывает процесс диспетчеризации. Но можно пойти ещё дальше и сделать диспетчеризацию по ключу ассоциативного массива:

<?php

$databaseSettingsByEnv = [
    'development' => [
        'adapter' => 'sqlite',
    ],
    'production' => [
        'adapter' => 'postgresql',
    ],
];

$databaseConfiguration = $databaseSettingsByEnv[$env];

Значение по умолчанию легко добавить через оператор ??:

<?php

$databaseConfiguration = $databaseSettingsByEnv[$env] ?? [ 'adapter' => 'memory' ];

Этот вариант лучше предыдущих двух сразу по нескольким причинам. Во-первых, он короче, во-вторых, он гибче. Условные конструкции это статичный код, который нельзя поменять без переписывания самой программы в отличие от последнего варианта. А вот данные это совсем другое дело. Для удобства их часто кладут в файлы конфигурации, которые используют формат JSON или YAML, например:

---

development:
  adapter: sqlite

production:
  adapter: postgresql 

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


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
1 июня 10 месяцев

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»