Конструкция Switch | Основы PHP

Для перемещения по курсу нужно зарегистрироваться

1. Введение ↳ теория

2. Hello, World! ↳ теория / тесты / упражнение

3. Инструкции ↳ теория / тесты / упражнение

4. Арифметические операции ↳ теория / тесты / упражнение

5. Линтер ↳ теория / тесты / упражнение

6. Строки ↳ теория / тесты / упражнение

7. Типы данных ↳ теория / тесты / упражнение

8. Переменные ↳ теория / тесты / упражнение

9. Выражения в определениях ↳ теория / тесты / упражнение

10. Интерполяция ↳ теория / тесты / упражнение

11. Извлечение символов из строки ↳ теория / тесты

12. Функции и их вызов ↳ теория / тесты / упражнение

13. Сигнатура функции ↳ теория / тесты / упражнение

14. Вызов функции — выражение ↳ теория / тесты / упражнение

15. Функции с переменным числом параметров ↳ теория / тесты / упражнение

16. Детерминированность и побочные эффекты ↳ теория / тесты / упражнение

17.

Стандартная библиотека ↳ теория / тесты / упражнение

18. Определение функции ↳ теория / тесты / упражнение

19. Возврат значений из функции ↳ теория / тесты / упражнение

20. Параметры функций ↳ теория / тесты / упражнение

21. Необязательные параметры функций ↳ теория / тесты / упражнение

22. Окружение ↳ теория / тесты / упражнение

23. Именование ↳ теория / тесты / упражнение

24. Логические операции ↳ теория / тесты / упражнение

25. Условные конструкции if и if-else ↳ теория / тесты / упражнение

26. Тернарный оператор и Элвис ↳ теория / тесты / упражнение

27. Конструкция Switch ↳ теория / тесты / упражнение

28. Цикл while ↳ теория / тесты / упражнение

29. Использование циклов ↳ теория / тесты / упражнение

30. Пограничные случаи ↳ теория / тесты / упражнение

31. Цикл for ↳ теория / тесты / упражнение

32. Погружаясь в строки ↳ теория / тесты / упражнение

33. Дата и время ↳ теория / тесты / упражнение

34. Отладка ↳ теория / тесты / упражнение

35. Ошибки ↳ теория / тесты / упражнение

36. Включение файлов ↳ теория / тесты / упражнение

37. Пространство имен ↳ теория / тесты / упражнение

38. Вложенные пространства имен ↳ теория / тесты / упражнение

39. Импорт функций ↳ теория / тесты / упражнение

40. Описание типов ↳ теория / тесты / упражнение

41. Ссылки ↳ теория / тесты / упражнение

42. История PHP ↳ теория

Испытания

1. Сумма двоичных чисел

2. Степень тройки

3. Фибоначчи

4. Добавляем цифры

5. Сбалансированные скобки

6. Совершенные числа

7. Счастливый билет

8. Физзбазз

Порой обучение продвигается с трудом. Сложная теория, непонятные задания… Хочется бросить. Не сдавайтесь, все сложности можно преодолеть. Рассказываем, как

Не понятна формулировка, нашли опечатку?

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

Что-то не получается в уроке?

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

  1. Изучите вопросы, которые задавали по уроку другие студенты — возможно, ответ на ваш уже есть
  2. Если вопросы остались, задайте свой. Расскажите, что непонятно или сложно, дайте ссылку на ваше решение. Обратите внимание — команда поддержки не отвечает на вопросы по коду, но поможет разобраться с заданием или выводом тестов
  3. Мы отвечаем на сообщения в течение 2-3 дней. К «Обсуждениям» могут подключаться и другие студенты. Возможно, получится решить вопрос быстрее!

Подробнее о том, как задавать вопросы по уроку

Примеры switch case в PHP

Конструкция switch-case очень похожа на условный оператор if-else, но имеет свои особенности. Целесообразнее использовать именно switch-case, когда выбор среди сравниваемых значений, предстоит сделать из большего количества вариантов.

Пример 1

Представим ситуацию, что вам заказали написать часть программы для прохождения онлайн теста по географии. Участники должны предложить свой вариант и в зависимости от ответа выведется на экран та или иная надпись.

Вопрос: Назовите страну из первой тройки с самой большой численностью населения?

<?php
  $pop ="Китай"; //значение переменной
  switch ($pop) { //условный оператор
    case "Китай"://ключевое слово
    echo "Китай занимает первое место"; //вывод на экран
    break;
    case "Индия":
    echo "Индия занимает второе место";
    break;
    case "США":
    echo "США занимают третье место";
    break; //оператор переходит к default
    default:
    echo "Вам надо подучить географию. ";
}
?>

Как работает оператор switch?

Когда участник введёт слово, например Китай, это слово запишется в переменную $pop, оператор switch

пройдется по меткам (case) по порядку, пока значение переменной не совпадет с одним из значений кейса, тогда на экран выведется: Китай занимает первое место. Но если участник введет, например слово Россия, которого нет в коде программы, то switch, не обнаружив совпадений, наткнется на break и перейдет к выполнению дефолтным инструкций, выведет на экран: Вам надо подучить географию.

Break не обязателен

Если предусмотрено выполнение только одного кейса, то в конце case обязательно должно стоять ключевое слово break, которое прерывает работу оператора switch, как только значение будет найдено или не найдено (ничего не выведет на экран или дефолтное сообщение).

Давайте посмотрим на примере, что произойдет, если в скрипте после case не будет ключевого слова break.

Пример 2

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

<?php
  $repka = "мышка";
  switch ($repka) {
    case "мышка": echo "Мышка за кошку";
    case "кошка": echo "Кошка за жучку";
    case "жучка": echo "Жучка за внучку";
    case "внучка": echo "Внучка за бабку";
    case "бабка": echo "Бабка за дедку";
    case "дедка": echo "Дедка за репку";
}
?>

В переменной $repka оказалась мышка, оператор switch обнаружил мышку и ничто ему не мешает перебрать все кейсы и вывести их значения по порядку. Выполняются все кейсы, идущие следом за совпадающими значениями.

Мышка за кошку
Кошка за жучку
Жучка за внучку
Внучка за бабку
Бабка за дедку
Дедка за репку

Но когда в переменную попадает дедка, то на экран выведется только последний кейс.


Дедка за репку
Пример 3

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

<?php
  $cheese = 'Камамбер';
  switch ($cheese) {
  case 'Пармезан';
    case 'Моцарелла';
    case 'Камамбер';
    echo 'Вы настоящий гурман';
    break;
    default;
    echo 'У вас непритязательный вкус.';
    break;
}
?>

Пример, классической манипуляции, пользователь вводит любой сорт сыра из кейсов, то ему на экране выводится приятное сообщение Вы настоящий гурман. Если пользователь введет название какого-нибудь дешевого сыра, то увидит обидное сообщение – У вас непритязательный вкус.

Выводы

Когда же лучше использовать

конструкцию switch-case, если if-else, делает тоже самое. Используйте оператор switch, когда надо сравнивать больше, чем два значения или ваше условие сложнее, чем простое сравнение.

  • Создано 22.03.2019 10:37:00
  • Михаил Русаков

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov. ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

PHP 8: совпадать или поменять?

« назад — написал Брент 08 июля 2020 г.

PHP 8 представляет новое выражение match . Мощная функция, которая часто будет лучшим выбором для использования коммутатора

. Так в чем именно отличия?

Начнем со сравнения. Вот классический пример коммутатора :

 переключатель ($statusCode) {
    дело 200:
    случай 300:
        $ сообщение = ноль;
        перерыв;
    случай 400:
        $ сообщение = 'не найдено';
        перерыв;
    случай 500:
        $message = 'ошибка сервера';
        перерыв;
    по умолчанию:
        $message = 'неизвестный код состояния';
        перерыв;
} 

Вот его соответствует эквиваленту :

 $message = совпадение ($statusCode) {
    200, 300 => ноль,
    400 => 'не найдено',
    500 => 'ошибка сервера',
    по умолчанию => 'неизвестный код состояния',
}; 

Прежде всего, выражение соответствует значительно короче:

  • не требует оператора break
  • он может объединять разные руки в одну с помощью запятой
  • возвращает значение, поэтому вам нужно присвоить значение только один раз

Это уже довольно много, но это еще не все!

# Без приведения типа

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

 $statusCode = '200';
$message = совпадение ($statusCode) {
    200 => ноль,
    по умолчанию => 'неизвестный код состояния',
};
// $message = 'неизвестный код состояния' 

Заметил тпйо? Вы можете отправить PR, чтобы исправить это. Если вы хотите быть в курсе того, что происходит в этом блоге, вы можете подписаться на меня. в Твиттере или подпишитесь на мою рассылку:

# Неизвестные значения вызывают ошибки

Если вы забудете проверить значение и если не указана рука по умолчанию , PHP выдаст исключение UnhandledMatchError . Снова больше строгости, но это предотвратит незамеченные тонкие баги.

 $statusCode = 400;
$message = совпадение ($statusCode) {
    200 => 'идеально',
};
// UnhandledMatchError 

Как и в случае коротких замыканий, вы можете написать только одно выражение. Блоки выражений, вероятно, будут добавлены в какой-то момент, но пока неясно, когда именно.

# Сочетание условий

Вы уже заметили отсутствие перерыва ? Это также означает, что совпадает с , что не допускает провальных условий, таких как две объединенные строки case в первых переключатель пример. С другой стороны, вы можете комбинировать условия в одной строке, разделяя их запятыми.

Таким образом, у вас есть те же функции, что и у коммутатора в этом отношении, но с меньшим количеством записей и меньшим количеством способов испортить. Беспроигрышный вариант!

 $message = совпадение ($statusCode) {
    200, 300, 301, 302 => 'комбинированные выражения',
}; 

# Сложные условия и производительность

Во время обсуждения RFC некоторые люди предложили следующий шаблон в качестве аргумента против добавления соответствует выражению :

 $сообщение = [
    $this->matchesRegex($line) => 'соответствие A',
    $this->matchesOtherRegex($line) => 'соответствие B',
][$строка] ?? 'не совпадает'; 

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

# Генерация исключений

Наконец, из-за выражений throw в PHP 8 также можно бросить прямо из руки, если хотите.

 $message = совпадение ($statusCode) {
    200 => ноль,
    500 => выдать новый ServerError(),
    по умолчанию => 'неизвестный код состояния',
}; 

# Сопоставление с образцом

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

Сопоставление с образцом сейчас не поддерживается, потому что это довольно сложная функция, но Илья Товило, автор RFC, упомянул ее как возможную будущую функцию. Есть на что обратить внимание!

Дизайн, основанный на мнении

# Итак, сменить или совместить?

Если бы мне нужно было обобщить выражение match в одном предложении, я бы сказал, что это более строгая и современная версия своего маленького брата switch .

Есть какие-то дела — видишь, что я там делал? — где переключение на обеспечит большую гибкость, особенно с многострочными кодовыми блоками. Однако строгость соответствия 9Оператор 0004 привлекателен, а перспектива сопоставления с образцом изменит правила игры для PHP.

Признаюсь, в последние годы я никогда не писал оператор switch из-за его многочисленных особенностей; причуды, которые на самом деле решает соответствует . Так что, хотя это еще не идеально, есть варианты использования, которые я могу придумать, когда соответствует , было бы хорошим… совпадением.

Каково ваше мнение?

Как переключаться между несколькими версиями PHP в Debian 11/10 — TecAdmin

В вашей системе, если вы установили несколько версий PHP (например, PHP 8.1, 8.0, 7.4, 7.3, 7.2, 7.1 и 5.6). PHP 7.2 работает как PHP по умолчанию для Apache и CLI. Для любого требования вам нужно использовать PHP 5.6. Тогда вам не нужно удалять PHP 7.2. Вы можете просто переключить версию PHP на используемую по умолчанию для Apache и командной строки.

Реклама

Мы предполагаем, что вы установили несколько версий PHP в своей системе Debian. Теперь вам нужно переключить активную версию PHP на CLI и Apache2. Это руководство поможет вам переключаться между несколькими версиями PHP для сервера Apache и CLI в Debian.

  • Читать => Как установить PHP на Debian 11 через PPA
  • Читать => Как установить PHP на Debian 10 через PPA

Мы установили PHP 8.1, PHP 7.4 и PHP 5.6 в нашу систему Debian. Вы можете использовать то же самое для других версий PHP, соответственно изменив команды.

Включить PHP 8.1 в качестве версии по умолчанию

Вам необходимо установить PHP 8.1 в качестве активной версии PHP для CLI и Apache2. Вы можете сделать это, отключив модули Apache2 для всех других установленных версий PHP и настроив CLI с помощью команды update-alternatives.

  • Для Apache: -
    Выполните следующую команду, чтобы отключить модуль Apache для других версий PHP.
     судо a2dismod php7.4 php5.6
     

    Теперь включите модуль PHP 8.1 на сервере Apache.

     судо a2enmod php8.1
      перезапуск службы sudo apache2  
  • Для интерфейса командной строки: -
     sudo update-alternatives --set php /usr/bin/php8.1
      sudo update-alternatives --set phar /usr/bin/phar8.1 
      sudo update-alternatives --set phar.phar /usr/bin/phar.phar8.1 
      sudo update-alternatives --set phpize /usr/bin/phpize8.1 
      sudo update-alternatives --set php-config /usr/bin/php-config8.1  

Примечание — Команда phpize8.1 и php-config8.1 доступна в пакете php8.1-dev . Это более полезно для компиляции модулей PHP с использованием pecl.

Включить PHP 7.4 в качестве версии по умолчанию

Вам необходимо установить PHP 7.4 в качестве активной версии PHP как для CLI, так и для Apache2. Вы можете сделать это, отключив модули Apache2 для всех других установленных версий PHP и настроив CLI с помощью команды update-alternatives.

  • Apache: -
    Выполните следующие команды, чтобы отключить модуль Apache для других версий PHP
     sudo a2dismod php8.1 php5.6
     

    Теперь включите модуль PHP 7.4 на сервере Apache.

     судо a2enmod php7.4
      перезапуск службы sudo apache2  
  • Интерфейс командной строки: -
     sudo update-alternatives --set php /usr/bin/php7.4
      sudo update-alternatives --set phar /usr/bin/phar7.4 
      sudo update-alternatives --set phar.phar /usr/bin/phar.phar7.4 
      sudo update-alternatives --set phpize /usr/bin/phpize7. 4 
      sudo update-alternatives --set php-config /usr/bin/php-config7.4  

Примечание — Команда phpize7.4 и php-config7.4 доступна в пакете php7.4-dev . Это более полезно для компиляции модулей PHP с использованием pecl.

Включить PHP 5.6 в качестве версии по умолчанию

Разработчики PHP больше не поддерживают PHP 5.6. Настоятельно рекомендуется перейти на более позднюю версию PHP, например 7.4 или 8.1. Но вы все же можете установить и использовать php 5.6 в своей системе Debian, если вашему приложению требуется PHP 5.6. Давайте установим PHP 5.6 в качестве версии по умолчанию для CLI и Apache2.

  • Apache: -
    Выполните следующие команды, чтобы отключить другие версии PHP, такие как (php 8.1, php7.4 и т. д.) для Apache и командной строки.
     судо a2dismod php7.4 php8.1 php8.0
     

    Теперь включите модуль PHP 5.6 на сервере Apache.

     судо a2enmod php5.