[RFC] Match expression
| From: | ilija dot tovilo at me dot com | Date: | Sat, 09 Sep 2017 11:21:03 +0000 |
| Subject: | [RFC] Match expression | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-100487@lists.php.net to get a copy of this message | ||
Hi everybody!
Has this idea been discussed before?
I find myself writing switch statements in PHP quite rarely. This has a few reasons:
1. It doesn’t have a "strict_types” version
2. It is quite verbose (lots of breaks)
3. It is a statement rather than an expression
Often, if / elseif statements turn out to be shorter, safer and easier to read than the switch
statement.
What I’d really love is something like a match expression:
```
$r = match ($x) {
1: ‘Tiny’;
<= 10: ‘Small’;
<= 20: ‘Medium’;
<= 30: ‘Large’;
range(31, 100): ‘Enormous’; // Equivalent to
in_array($x, range(31, 100),
true)
instanceof Foo, instanceof Bar: ‘What?’;
default: ‘Unknown’;
};
```
These are the main differences compared to a traditional switch statement:
- The whole match is an expression, the result of the executed case is
implicitly returned
- It allows pattern matching, not just == comparison, === is the default
- It does no implicit type conversion, thus no unexpected results when mixing strings and numbers
- Each case has an implicit break
- Where you’d previously use two cases without a break, you now combine
conditions using a comma
One downside, since PHP doesn’t implicitly return the last statement as some languages do
there’s no obvious way to do multi-statement cases.
I assume that some people will not be so happy about having to switch-like constructs. IMO the
implicit type conversion is the biggest issue here. Maybe we could offer a solution for this one at
least.
Just some random thoughts.
Regards