<?php switch ($expr) { case 0: echo 'First case, with a break'; break; case 1: echo 'Second case, which falls through'; // no break case 2: case 3: case 4: echo 'Third case, return instead of break'; return; default: echo 'Default case'; break; } switch ($expr) { case 0: echo 'First case,'; case 1: echo 'Second case'; // no break case 2: case 3: echo 'Third case'; return; default: echo 'Default case'; break; } switch ($foo) { case 'Foo': { echo 'foo'; break; } } while ($i < 10) { switch ($foo) { case '1': case '2': ++$i; continue 2; case '3': return $i; } } switch (true) { case is_resource($value): throw new Exception('foo'); case is_object($value): return 'object'; } switch (0) { case 0: switch (1) { case 1: echo 'a'; break; } break; } switch ($foo) { case Foo::ONE: case Foo::TWO: case Foo::Class: break; } switch (true) { case $value instanceof StdClass: return 1; case strpos('_', get_class($value)) !== false: break; } switch (true) { case $value instanceof StdClass: if ($value) { return null; } } use Vendor\Test\FooBar; function test() { switch ($val) { case 'foo': echo 'foo'; break; default: echo 'foo'; } exit; } switch ($foo) { case 1: $bar = 1; break; case 2: $bar = 2; break; case 21: case 3: return 3; default: $bar = 0; } switch ($foo) { case 'foo': // some comment echo 'foo'; break; case 'bar': // some comment echo 'bar'; break; case 'baz': // phpcs:ignore Standard.Category.Sniff echo 'baz'; break; case 'boo': // other comment echo 'boo'; break; default: // other comment echo 'default'; break; } switch($foo) { case ('foo'): default: { $foo = 'foo'; break; } } switch ($foo) { case Foo::INTERFACE: return self::INTERFACE; case Foo::NAMESPACE: return self::MODULE; case Foo::TRAIT: case Foo::ARRAY: return self::VALUE; } // OK: Every clause terminates switch ($foo) { case 1: if ($bar > 0) { return 0; } else { return 1; } case 2: return 2; } // ERROR: No else clause switch ($foo) { case 1: if ($bar > 0) { return 0; } elseif ($bar < 0) { return 1; } case 2: return 2; } // OK: No fall-through present switch ($foo) { case 1: if ($bar > 0) { return 0; } elseif ($bar < 0) { return 1; } } // ERROR: No else clause (nested) switch ($foo) { case 1: if ($bar > 0) { return 0; } else { if ($foo > $bar) { continue; } } case 2: return 2; } // OK: Every clause terminates switch ($foo) { case 1: if ($bar > 0) { return 0; } else { if ($foo > $bar) { continue; } else { break; } } case 2: return 2; } // ERROR: Non-termination IF clause switch ($foo) { case 1: if ($bar > 0) { $offset = 0; } else { break; } case 2: return 2; } // ERROR: Non-termination IF clause (nested) switch ($foo) { case 1: if ($bar > 0) { continue; } else { if ($foo > $bar) { $offset = 0; } else { break; } } case 2: return 2; } switch ($sContext) { case 'SOMETHING': case 'CONSTANT': do_something(); break; case 'GLOBAL': case 'GLOBAL1': do_something(); // Fall through default: { do_something(); } } $foo = $foo ? function () { switch ($a) { case 'a': break; } } : null; switch ($foo) { case Foo::INTERFACE: echo '1'; return self::INTERFACE; case Foo::TRAIT: case Foo::ARRAY: echo '1'; return self::VALUE; } // OK: Every clause terminates switch ($foo) { case 1: switch ($bar) { case 1: return 1; default: return 3; } case 2: return 2; } // KO: Not every clause terminates switch ($foo) { case 1: switch ($bar) { case 1: return; } case 2: return 2; } // KO: Not every clause terminates switch ($foo) { case 1: switch ($bar) { case 1: return; default: $a = 1; } case 2: return 2; } // OK: Every clause terminates switch ($foo) { case 1: switch ($bar) { case 1: return 1; default: throw new \Exception(); } case 2: return 2; } switch ($foo) { case 1: // phpcs:ignore case 2: return 1; case 3: return 2; } // Issue 3352. switch ( $test ) { case 2: // comment followed by empty line break; case 3: /* phpcs:ignore Stnd.Cat.SniffName -- Verify correct handling of ignore comments. */ break; case 4: /** inline docblock */ break; case 5: /* checking how it handles */ /* two trailing comments */ break; case 6: // Comment as first content of the body. break; case 7: /* phpcs:ignore Stnd.Cat.SniffName -- Verify correct handling of ignore comments at start of body. */ break; case 8: /** inline docblock */ break; } // Handle comments correctly. switch ($foo) { case 1: if ($bar > 0) { doSomething(); } // Comment else { return 1; } case 2: return 2; } switch ($foo) { case 1: if ($bar > 0) /*comment*/ { return doSomething(); } else { return 1; } case 2: return 2; } // Issue #3297. // Okay - finally will always be executed, so all branches are covered by the `return` in finally. switch ( $a ) { case 1: try { doSomething(); } catch (Exception $e) { doSomething(); } catch (AnotherException $e) { doSomething(); } finally { return true; } default: $other = $code; break; } // Okay - all - non-finally - branches have a terminating statement. switch ( $a ) { case 1: try { return false; } catch (Exception $e) /*comment*/ { return true; } // Comment catch (AnotherException $e) { return true; } finally { doSomething(); } default: $other = $code; break; } // Okay - finally will always be executed, so all branches are covered by the `return` in finally. // Non-standard structure order. switch ( $a ) { case 1: try { doSomething(); } catch (Exception $e) { doSomething(); } finally { return true; } catch (AnotherException $e) { doSomething(); } default: $other = $code; break; } // Okay - all - non-finally - branches have a terminating statement. // Non-standard structure order. switch ( $a ) { case 1: try { return false; } finally { doSomething(); } catch (MyException $e) { return true; } catch (AnotherException $e) { return true; } default: $other = $code; break; } // All okay, no finally. Any exception still uncaught will terminate the case anyhow, so we're good. switch ( $a ) { case 1: try { return false; } catch (MyException $e) { return true; } catch (AnotherException $e) { return true; } default: $other = $code; break; } // All okay, no catch switch ( $a ) { case 1: try { return true; } finally { doSomething(); } case 2: $other = $code; break; } // All okay, try-catch nested in if. switch ( $a ) { case 1: if ($a) { try { return true; // Comment. } catch (MyException $e) { throw new Exception($e->getMessage()); } } else { return true; } case 2: $other = $code; break; } // Missing fall-through comment. switch ( $a ) { case 1: try { doSomething(); } finally { doSomething(); } case 2: $other = $code; break; } // Missing fall-through comment. One of the catches does not have a terminating statement. switch ( $a ) { case 1: try { return false; } catch (Exception $e) { doSomething(); } catch (AnotherException $e) { return true; } finally { doSomething(); } default: $other = $code; break; } // Missing fall-through comment. Try does not have a terminating statement. switch ( $a ) { case 1: try { doSomething(); } finally { doSomething(); } catch (Exception $e) { return true; } catch (AnotherException $e) { return true; } default: $other = $code; break; } // Missing fall-through comment. One of the catches does not have a terminating statement. switch ( $a ) { case 1: try { return false; } catch (Exception $e) { doSomething(); } catch (AnotherException $e) { return true; } default: $other = $code; break; } // Issue 3550 - comment after terminating statement. switch (rand()) { case 1: if (rand() === 1) { break; } else { break; // comment } default: break; }