мы пытаемся внедрить новые правила стиля кодирования для нашей команды, php codesniffer печатает предупреждение в операторах case switch, когда «break» не найден как:
switch ($foo) { case 1: return 1; case 2: return 2; default: return 3; }
есть ли веские основания для использования:
switch ($foo) { case 1: return 1; break; }
?? разрыв никогда не достигается?
Совершенно верно, если вы return
с switch
оставите break
.
Но довольно распространенная практика заключается в том, чтобы добавить явный break
в каждом case
в качестве защитной практики программирования .
switch ($foo) { case 1: return 1; break; case 2: return 2; break; }
Идея состоит в том, что если позднее вы измените свой код в case 1
и удалите оператор return, вы можете забыть добавить break
.
Это случайно приведет к прохождению потока программы к case 2
.
switch ($foo) { case 1: somethingDifferent(); case 2: return 2; break; }
Падение буквенных утверждений несколько необычно, и вы должны добавить комментарий к своему коду, когда вы это сделаете, чтобы показать, что это намеренно.
switch ($foo) { case 1: somethingDifferentAndWeWantToDoCase2AsWell(); // fallthrough case 2: return 2; break; }
Как и во многих защитных методах программирования, вам нужно сбалансировать, стоит ли это разрастание кода, которое потенциально загромождает ваш код и делает его менее читаемым, стоит того или нет.
У меня есть гораздо лучшее решение. Пожалуйста, следуйте нижеприведенному коду для вышеперечисленного состояния:
$result = 3; // for default case switch ($foo) { case 1: $result = 1; break; case 2: $result = 2; break; default: // do nothing } return $result;
Это не приведет к какой-либо ошибке, и код также отлично подходит для понятий.
Если ваш «php codeniffer печатает предупреждение», попробуйте получить еще один лучший код и не забудьте попытаться использовать последнюю стабильную версию PHP. Вы можете, конечно, написать break
после одного return
, но это не имеет смысла. Потому что это никогда не будет читаться. Ваш код в порядке.
Посмотри на это:
$fn = function($ar) { switch ($ar) { case 1: return "uno"; case 2: return "two"; default: return "mehr als zwei"; } }; $str = $fn(4); // return "mehr als zwei"
Это просто и лучше. Меньше строки => меньше кода для поддержки 🙂
Я не специалист в области совершенного кодирования, но я думаю, что валидатор предпочел бы что-то подобное
switch ($foo) { case 1: $ret = 1; break; case 2: $ret = 2; break; default: $ret = 3 } return $ret
Я думаю, что использование выражения return in case для разрыва потока кода на самом деле не является лучшей практикой. Вот почему валидатор говорит, что нет перерыва …
За ваш вопрос о категории, я не знаю … извините
Из руководства по PHP ( http://us3.php.net/manual/en/control-structures.switch.php ):
PHP продолжает выполнять инструкции до конца блока коммутатора или в первый раз, когда видит оператор break. Если вы не напишете оператор break в конце списка операторов case, PHP продолжит выполнение утверждений следующего случая. Например:
<?php switch ($i) { case 0: echo "i equals 0"; case 1: echo "i equals 1"; case 2: echo "i equals 2"; } ?>
Здесь, если $ i равно 0, PHP выполнит все инструкции эха! Если $ i равно 1, PHP будет выполнять последние два выражения echo. Вы получите ожидаемое поведение ('i equals 2' будет отображаться), только если $ i равно 2. Таким образом, важно не забывать инструкции break (даже если вы, возможно, захотите избежать их назначения в определенных обстоятельствах ).