Re: instance version of match ?
| From: | Thomas Nunninger | Date: | Tue, 29 Mar 2022 13:33:41 +0000 |
| Subject: | Re: instance version of match ? | ||
| References: | 1 2 3 4 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-117445@lists.php.net to get a copy of this message | ||
Hi,
Am 29.03.22 um 14:34 schrieb Rowan Tommins:
On 29/03/2022 11:59, Robert Landers wrote:While I liked the intention of Karoly, I did not like the proposed magic. Would it be an idea (and possible) to extend the syntax somehow like: $result = match ($value) {Yeah, the instanceof operator is magic in that regard - it has a special parsing rule to consume the next token and avoid it being evaluated as a constant.$object instanceof AnotherInterface => 'bar',We can see thatSomeInterfacewill resolve the interface and not the constant.I think what they are proposing is that when the match is an object, and the branches are class/interface/etc names, it should just do anThat wouldn't work, because the type of value passed to match() can vary at run-time, but you'd need to compile the expression one way or the other. If it did work, it would be extremely confusing: function example(string|object $input) {instanceofoperation instead of a value-equals operation.return match($input) { SomeClass => 'found class', SOME_CONSTANT => 'found constant', };} var_dump( example(new SomeClass) ); var_dump( example(SOME_CONSTANT) ); Do both of those matches succeed? What if I set `const SomeClass = 'hello';`? So unfortunately we need some extra syntax to say that something should be an instanceof check, and therefore a class name.
instanceof MyObject => ...,= 42 => ...,
!== 5 => ...}; to be equivalent to: $result = match (true) {
$value instanceof MyObject => ...,
$value >= 42 => ...,
$value !== 5 => ...
};
Regards
Thomas