Как сделать кейсы 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 и если соблюдаются условия:
- Ты уже не Junior
- Переходить можно только вперёд
- Заходить в блоки и выходить категорически нельзя
Любой while и вложенные if так же опасны как goto . Для выхода из множественных циклов есть break N .
Плюсы которые я вижу
- Краткость и простота кода при соблюдении вышеописанных условиях
- Меньше занимаемой памяти и скорее всего быстрота выполнения
- Лучше "плохой тон", чем много избыточного кода, который сложнее поддерживать
Для себя я решил использовать только в группах исключающих условий:
Конечно при усложнении логики и увеличении строк кода, лучше всего воспользоваться ответом 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 несколько раз?
Всем привет с вами снова я Вадим, и сегодня я вам представлю новый гайд по приложению 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 можно сделать такую конструкцию:
И да, такой вариант получается интереснее и короче. Можно сказать что основной рабочий вариант, который стоит использовать.
Читайте также: