switch.default.multiple View as Markdown

Implemented (PHP 7.0)
Authors
Levi Morrison levim@php.net
Date
2014-08-05
Version
1.0
Source
wiki.php.net/rfc/switch.default.multiple

Vote

switch.default.multiple closed
Yes
28
No
0
28 voters
aharvey Yes 2014-09-05 20:33
ajf Yes 2014-09-05 21:33
ashnazg Yes 2014-09-10 20:34
auroraeosrose Yes 2014-09-05 20:47
ben Yes 2014-09-11 14:17
brianlmoon Yes 2014-09-15 14:20
bwoebi Yes 2014-09-06 01:16
datibbaw Yes 2014-09-07 05:28
davey Yes 2014-09-11 18:28
derick Yes 2014-09-08 10:03
dm Yes 2014-09-08 21:44
dmitry Yes 2014-09-16 09:03
fa Yes 2014-09-08 06:44
fredemmott Yes 2014-09-05 20:35
frozenfire Yes 2014-09-06 05:01
jedibc Yes 2014-09-07 18:07
krakjoe Yes 2014-09-05 20:21
levim Yes 2014-09-05 20:19
malukenho Yes 2014-09-11 13:49
mbeccati Yes 2014-09-09 08:11
mike Yes 2014-09-05 21:10
nikic Yes 2014-09-08 23:00
philstu Yes 2014-09-10 21:03
ramsey Yes 2014-09-11 14:47
rdlowrey Yes 2014-09-10 12:52
salathe Yes 2014-09-15 10:24
sebastian Yes 2014-09-05 20:32
stas Yes 2014-09-15 06:21

Discussions on the mailing list

[RFC] Disallow multiple default blocks in a single switch statement
by Sara Golemon · 48 messages
[VOTE] Mutliple defaults in switch statements
by Sara Golemon · 10 messages
[VOTE] Removing Multiple Default Clauses in Switch Statements
by Levi Morrison · 7 messages

RFC text

Copied from wiki.php.net, last synchronized Oct 13, 2026 11:51 UTC

Introduction

Bug 67757 notes that the recently introduced PHP language specification differs from PHP's behavior when a switch statement defines multiple default cases. The spec claims the following is a syntax error, while PHP will execute it with the last default block being taken:

switch ($expr) {
  default:
    neverExecuted();
    break;
  default:
    executed();
}

Proposal

This issue can be fixed by altering the spec to match PHP's behavior, or fixing PHP to treat multiple defaults as an error. This RFC opts for the latter; it also provides a deprecation route.

PHP 5.7: Raise E_DEPRECATED each time a default blocks after the first is encountered; continue to execute only the last default block. PHP 7.0: Raise E_COMPILE_ERROR when multiple default blocks are found.

Backward Incompatible Changes

There may be code out there (maybe generated code?) which relies on being able to define multiple default blocks and having only the last block executed. This RFC takes the position that multiple default blocks was an implementation detail that should not have been relied upon.

Implementation

Already landed in HHVM:

Proposed PHP Version(s)

This RFC targets both PHP 5.7 and 7.0.

Vote

This RFC modifies the PHP language and requires 2/3 vote in the affirmative to pass. Voting will remain open through Monday, September 15th.

Should we deprecate multiple default clauses in switch statements in PHP 5.7 and remove them in PHP 7, as outlined and implemented in this RFC?

Vote: switch.default.multiple — Yes: 28 · No: 0 (closed)

Voting was unambiguously in favor of this RFC.

Changelog

  • Vote opened (2014-08-12 16:50 UTC)
  • Voting cancelled (2014-08-13 15:35 UTC)
  • Levi Morrison claims ownership of RFC (2014-08-14 17:13 UTC)
    • Changes RFC to target PHP 7 for removal, with deprecations going into PHP 5.7.
  • Added implementation for PHP 5.7 (2014-09-05 20:42 UTC)
  • Voting is open (2014-09-05 21:19 UTC) and will close in ten days.
  • Updated implementation for PHP 7.0 because of AST merge (2014-09-05 22:16 UTC)