Версии кода кодирования PHP; в переключателе / ​​корпусе

мы пытаемся внедрить новые правила стиля кодирования для нашей команды, 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 (даже если вы, возможно, захотите избежать их назначения в определенных обстоятельствах ).