On mardi 29 mars 2022 15:33:41 CEST Thomas Nunninger wrote:
> Hi,
>
> Am 29.03.22 um 14:34 schrieb Rowan Tommins:
> > On 29/03/2022 11:59, Robert Landers wrote:
> >> $object instanceof AnotherInterface => 'bar',
> >>
> >> We can see that `SomeInterface` will resolve the interface and not the
> >> constant.
> >
> > 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.
> >
> >> 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 an
> >> `instanceof` operation instead of a value-equals operation.
> >
> > That 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) {
> >
> > 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.
>
> 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) {
> instanceof MyObject => ...,
>
> >= 42 => ...,
>
> !== 5 => ...
> };
>
> to be equivalent to:
>
> $result = match (true) {
> $value instanceof MyObject => ...,
> $value >= 42 => ...,
> $value !== 5 => ...
> };
>
>
> Regards
> Thomas
I like this.
The pattern matching RFC may also cover this:
https://wiki.php.net/rfc/pattern-matching
-- Arnaud
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php