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

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to