Re: Inconsistency in PHP 8.5 deprecation of terminating case with semicolon
| From: | Theodore Brown | Date: | Wed, 15 Oct 2025 04:21:52 +0000 |
| Subject: | Re: Inconsistency in PHP 8.5 deprecation of terminating case with semicolon | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-128840@lists.php.net to get a copy of this message | ||
On Tue, October 14 2025 at 18:08 Juliette Reinders Folmer wrote:
> Dear Theodore and list,
>
> I've been looking into the "Deprecate semicolon after case in switch statement"
> PHP 8.5 deprecation [1]
> with the aim of adding a sniff for this to the PHPCompatibility standard and I'm noticing
> an oddity for
> which I would like to clarify whether this is intentional or an oversight..
>
> As demonstrated in the example code provided in the deprecation RFC, both switch
>
case condition
> statements, as well as default statements, can be ended with a
> semicolon.
>
> So when I first read the RFC, I interpreted the proposal to include both
> case as well as default,
> as, in my mind, default is just a special
> case in a switch.
>
> However, the RFC explicitly only talked about deprecating the use of a semicolon after a
> case statement and the implementation has followed this to the
> letter. [2]
>
> The net result of this, is that you can now have a switch
> statement with semicolons
> terminating case statements and
> default statements, where the former
> (case) will
> result in a deprecation notice, while the latter (default) will
> not. For an example, see [3]
>
> This feels inconsistent to me and counter to the intention of the RFC, which is stated to be:
>
>> Case statements followed by a semicolon can cause confusion, as a developer may think they
>> behave differently in some way from regular case statements (e.g. preventing fallthrough),
>> when they do not.
>
> Which leaves me wondering what the reason was not to _also_ deprecate the use of a semicolon
> to terminate a default statement in a switch ? I can't
> find any discussion about this in the
> original mailing list thread [4].
>
> Anyone would care to clarify ?
Hi Juliette,
Thank you for pointing out the discrepancy. You are correct that default is just a
special
case statement, and the intention in the RFC was to output the deprecation message for default cases
as well (the example in the RFC included a default case followed by a semicolon to highlight this).
The fact that a deprecation message isn't shown for default cases is an oversight on my part
when I implemented the RFC. The merged implementation correctly updated the AST for default
case statements followed by a semicolon to support the deprecation message, but I failed to
notice that when the compiler code loops over switch cases, there is a continue
statement
when handling the default case which prevents reaching the code for the deprecation.
I opened a follow-up pull request to fix this, which can hopefully be merged before
PHP 8.5 is released: https://github.com/php/php-src/pull/20172
Kind regards,
Theodore
>
> Smile,
> Juliette
>
> [1]:
> https://wiki.php.net/rfc/deprecations_php_8_5#deprecate_semicolon_after_case_in_switch_statement
> [2]:
> https://github.com/php/php-src/commit/5f8d648af6ef4e29a3c7f2b2029d08466c12bc6f
> [3]: https://3v4l.org/liFIK/rfc#vgit.master
> [4]: https://externals.io/message/126000