Как сделать кейсы php

Обновлено: 06.07.2024

Есть задача при использовании switch у разных case выполнять еще и код из default (или например final реализовать), что бы не дублировать одинаковый код в разных кейсах.

Если убрать break у варианта b , то будет выполнен лишний код

Есть решение через goto , что является плохим стилем кодирования:

Полная задача

Есть массив полей разных сущностей и нужно разные действия у разных полей сделать.

Вопрос

Как это сделать без использования goto ? Может есть вариант с другим подходом в архитектуре.

P.S. Если goto здесь уместен (лично я не боюсь динозавров), то почему это плохой стиль кодирования?



тело default вынесите из case и будет вам счастье. goto не плохой, просто им мало кто умеет пользоваться, поэтому лучше забыть про него.

вы может не ту задачу решаете? Делаете ваши а, бэ и прочее классами и там уже реализуете такое поведение. Ну может и не классами их делать, а просто вынести обработку этих значений в отдельные классы. Если у вас будет куча таких значений то как-то не совсем удобно с этим работать будет и без всяких там goto

Goto ненавидят только полные нубы. Причём ненавидят демонстративно, чтобы казаться умнее. Так они считают. Но мало кто знает, что и switch тоже считается плохим стилем. Пользуйтесь всеми инструментами языка, исходя из здравого смысла, а не потому, что какой-то крикун что-то там кричит о каком-то там стиле.

Зачем усложнять? Можно вынести повторяющийся код в функцию/метод класса и вызывать их из каждого кейса. Кода получится ровно столько же, зато goto мы не используем и код остаётся читаемый и легко поддерживаемый:


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

ООП и стайл гайды ООПшных языков обычно и предполагают небольшие легко читабельные методы. Не вижу тут проблемы

Проблема в том, что придётся тогда для этого отдельный класс делать для обработки полей, а много классов усложняет чтение программы, согласитесь, проще линейный листинг в 50 строк прочесть чем 10 с кучей вхождений

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

Если только одно действие не должно быть продолжено default , почему бы не попробовать вынести default действие за switch и огородить if ($fieldName != 'id')



Всё, что делает default, завернуть в функцию. В нужных кейсах добавляется всего-то один вызов функции.

@banme да, вариант, но не хотелось быть сильно декомпозицию и так не сложного метода делать. Хочется всю обработку полей в одном методе сделать

Можно оформить условия как отдельные функции (методы).

Ключевая функция. Получает действие на входе и выполняет соответствующую функцию:

Собственно действия. Возвращают true или false как маркеры необходимости выполнять действие по умолчанию.

Функция (метод) для действия по умолчанию:

вариант конечно интересный, но во-первых кода стало больше, во-вторых при ООП походе кода в таком решении кода будет еще больше и в третьих усложняет чтение кода

Не думаю, что код станет менее читаемым. Здесь каждая функция выполняет ОДНУ И ТОЛЬКО ОДНУ задачу. В методологии SOLID речь идет о классах, но сути это не меняет.

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

Вывод

В данном случае использование goto допустимо, пока не будет добавлена подобная конструкция в синтаксис switch и если соблюдаются условия:

  1. Ты уже не Junior
  2. Переходить можно только вперёд
  3. Заходить в блоки и выходить категорически нельзя

Любой while и вложенные if так же опасны как goto . Для выхода из множественных циклов есть break N .

Плюсы которые я вижу

  1. Краткость и простота кода при соблюдении вышеописанных условиях
  2. Меньше занимаемой памяти и скорее всего быстрота выполнения
  3. Лучше "плохой тон", чем много избыточного кода, который сложнее поддерживать

Для себя я решил использовать только в группах исключающих условий:

Конечно при усложнении логики и увеличении строк кода, лучше всего воспользоваться ответом n4nn31355 и выносить в классы и отдельные методы, но внутри у них все равно наверно будет что-то похожее ;)

Проблема стоит в последнем case "order.php". У меня генерируются страницы с адресами вида:
. /index.php?action=order.php?id=1Д52013
Т.е. надо как-то последнему case указать, чтобы он подключал файл order.php для всех случаев, когда получает строку вида "order.php-какой-угодно-текст". Можно ли как-то это описать?
Заранее спасибо.

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

Возможно ли прописать в один CASE несколько значений
Возможно ли прописать в один case значение id от 101 до 110 (чтобы не прописывать case 101. case.


Как использовать один и тот же case в switch несколько раз?
Как использовать один и тот же case в switch несколько раз?

SmartHelp

Всем привет с вами снова я Вадим, и сегодня я вам представлю новый гайд по приложению SmartBot

Как вы знаете у бота @gorillabot есть кейсы но у них либо они сделаны на цепочках или вообще на другом механизме.

Например: JavaScript или PHP

Только с помощью этих программ можно создать бота в ВК

В чём плюсы этих программ

JavaScript Плюсы и Минусы

+ Он бесплатный
+ Ты просто устанавливаешь рандомные плагины для своего бота
- Нужно знать язык програмирования
- Нужно зать Английский язык
- Нужно писать много комманд чтобы загрузить хотя бы один плагин

Тоже самое и PHP

SmartBot Плюсы и Минусы

+ Не нужно знать язык програмирования
+ Не нужно знать Английский язык
+ Пару переменных уже сделаны за тебя

- Он по тарифам
- Иногда могут быть баги в боте

Всё всё мы выяснили и

%баланс% - Локал. Строка. Нач. Зн. 0
%кейс1% - Локал. Строка. Нач. Зн. 0
%шанскейс1% - Локал. Строка. Нач. Зн. 0
%деньгикейс1% - Локал. Строка. Нач. Зн. Пусто
%рандомкейс1% - Локал. СТрока. Нач. Зн. Пусто

Значение Пусто значит ничего не пишем.

1. Сюрприз кейс
Стоимость: 500
Что узнать нифо о кейсе напишите "кейс инфо 1"

1. Сюрприз кейсы кол-во %кейс%

Чтобы купить кейсы напишите "кейс 1"

%н_ник%, инфо о кейсе:

Также вы можите свои призы придумывать для кейсов или создовать свои кейсы где больше призов только нужно создовать новые переменные

И если %кейс% (равно) 0

%н_ник%, у вас нету сюрприз кейса

Установить переменную
%рандомкейс% = %ранд(1,2)
%шанскейс% = %шанскейс% + %рандомкейс%

%н_ник%, вы успешно открыли кейс

Чтобы проверить что вам выпало напишите "проверить кейс 1"

И если %шанскейс1% (равно) 1

😒

%н_ник%, вам ничего не выпало

Установить переменную
%кейс% = %кейс1% -1
%шанскейс1% = 0

И если %шанскейс1% (равно) 2

Установить переменную
%деньгикейс1% = %ранд(1, 300)%

%н_ник%, вам выпали деньги в размере %деньгикейс1%

Установить переменную
%баланс% = %баланс% + %деньгикейс1%
%шанскейс1% = 0
%кейс1% = %кейс1% -1

И если %баланс% > 500

%н_ник%, вы успешно приобрели сюрприз кейс в кличестве 1 штуки

Установить переменную
%баланс% = %баланс% -500
%кейс% = %кейс% +1



У вас бывало такое, что нужно где-то получить данные из switch-case блока, при этом это нужно единожды и это где-то нужно здесь и сейчас. Например при инициализации массива? И не хочется куда-то выносить код, заводить отдельные переменные, которые будут использованы единожды, заводить отдельные структуры и выносить все это в отдельный файл или неймспейс? Если да, то можно воспользоваться альтернативой: использовать объекты и/или ассоциативные массивы для реализации логики switch-case — так называемые switch-hash структуры.

Типичная ситуация может выглядеть как-то так в мире JS:

Немного громоздко, вам не кажется? Можно было бы написать как-то так:

Слава самовызывающимся анонимным лямбда функциям. И такой код частенько можно увидеть в разных опенсорс проектах, на гитхабе, в npm модулях. Но если мы можем писать так, так почему тогда не избавиться от IIFE заменить их вместе с блоком switch-case на объект или массив?

Реализация switch-hash в JS

Этот код делает все тоже самое, но сильно короче, быстрее, не использует лишних конструкций.

В случае если у вас переменная выбора является числом, вы могли бы использовать массив:

Не нужно switch-case блока, не нужно функций.

Реализация switch-hash в PHP

В PHP так же можно реализовать switch-array структуры, но специфика языка добавляет свои нюансы на реализацию:

И точно так же в случае числовых switch-value используем не ассоциативный массив:

В целом очень похоже на JS, но есть специфика. Первое — используем символ @, который считается плохой практикой использовать, как бы… Но вопрос в том когда и зачем. Психотерапевты когда начинают лечить, первым делом добиваются того, чтобы человек принял себя таким, какой он есть. ?

Если в PHP есть оператор подавления ошибок, то им можно пользоваться, если вы понимаете что делаете. Не надо хаить языки, на которых вы пишите. Просто примите и полюбите их такими, какие они есть. Если изучить особенности своего инструмента, то всегда можно создавать надежные быстрые программы. Но это оффтоп, я знаю что найдутся несогласные со мной ?

И так, с символом подавления ошибок разобрались. Идем дальше. В PHP можно использовать два вида логических операторов:

И тут мы сразу натыкаемся на вопрос с собеседования по PHP:

В чем разница между операторами OR и || и почему выше в коде мы использовали идиоматическое OR а не символьное?

На собеседовании вам может попасться такая задачка:

Что будет выведено?

Если вы собеседуетесь на позицию php-fullstack , то вам добавят еще задачку из JS:

Разбираем по порядку.

Разбираемся с PHP.

В случае использования оператора || вычисляется сначала левая часть, так как это лево ассоциативный оператор, затем правая часть и затем вычисляется логическое ИЛИ, после чего результат присваивается в переменную.

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

На основе этого вам может попасться вариация задачки:

Собеседующий может менять вариации скобок, тем самым меняя группировку и поведение операторов.

Итого

Switch-hash с использованием тернарного оператора

Логическое ИЛИ можно заменить на короткую запись тернарного оператора и тогда в PHP можно сделать такую конструкцию:

И да, такой вариант получается интереснее и короче. Можно сказать что основной рабочий вариант, который стоит использовать.

Читайте также: