В этой заметке мы не будем рассуждать на тему правильного и чистого кода, что он должен быть коротким, и тд и тп...
Суть вопроса вот в чем. Есть линейное выполнение нескольких IF блоков, SWITCH блоков и все это в рамках одной функции или скрипта. По дефолту мы не можем вызвать блоки break в IF блоках, а в блоках SWITCH порой есть необходимость сгруппировать по смыслу несколько ветвей без брейка, но как управлять исключениями в таком случае? Поясню примерами.
Может быть такая ситуация
// ...
if(condition) {
// ... may be continue true
if(condition_a) {
// ... may be continue true
if(condition_b) {
// ... may be continue true
}
else {
// ... may be continue true
// ... some logic
}
}
else {
// ... may be continue true
// ... some logic
}
// ... may be continue true
// ... some logic
}
// contunue code thread
И тогда приходит в голову завести переменную $continue, которую выставляем в истину, если нужно перейти дальше, а в каждом блоке нужно делать проверку.
// ...
if(condition) {
$continue = false;
// ... may be continue true
if(condition_a && !$continue) {
// ... may be continue true
if (!$continue) {
if(condition_b) {
// ... may be continue true
}
else {
// ... may be continue true
// ... some logic
}
}
}
elseif (!$continue) {
// ... may be continue true
// ... some logic
}
// ... may be continue true
// ... some logic
}
// contunue code thread
Ну как-то так.
Что касается switch, то могут быть такие логические развязки:
switch ($route) {
case '/a':
// some do and continue
case '/b':
case '/c':
call_abc($route);
break;
case '/a1':
case '/b1':
case '/c1':
call_abc1($route);
break;
default:
// ...
}
// contunue code thread
Решение
Блок IF мы можем завернуть в блок do - while, тогда нам будут доступны break'и:
do {
if (a) { somedo(); break; }
if (b) { somedo(); break; }
if (c) { somedo(); break; }
} while(0);
Другой вариант - это использовать лейблы и блок goto. Да, много было сломано копий про ужасность этого оператора, но в PHP он имеет ограничения, так что наколбасить прям ужас ужас не получится.
if (a) { somedo(); goto mainthread; }
if (b) { somedo(); goto mainthread; }
if (c) { somedo(); goto mainthread; }
mainthread:
// contunue code thread
Ну и еще вариант, если вы можете использовать внешний скрипт как один большой switch-case, то вы просто можете делать return прямо из кода (не только из функции):
// ...
require __DIR__ . '/switch.php';
// contunue code thread
switch.php :
<?php declare(strict_types=1);
if (a) { somedo(); return; }
if (b) { somedo(); return; }
if (c) { somedo(); return; }
Я не вижу проблем в использовании таких подходов, особенно если это небольшие системные скрипты и утилиты.