[php-src] Issue #21362: `ReflectionMethod::invokeArgs()` for `Closure::__invoke()` accepts objects from different Closures

[email protected] (TimWolla)
Newsgroups php.bugs
Message-ID <[email protected]>
Issue: https://github.com/php/php-src/issues/21362
Author: TimWolla

### Description

The following code:

```php
<?php

$c = function ($foo, $bar) {
	echo "foo: {$foo}, bar: {$bar}\n";
};

$m = new ReflectionMethod($c, '__invoke');

$firstParam = $m->getParameters()[0]->getName();
var_dump($firstParam);
$secondParam = $m->getParameters()[1]->getName();
var_dump($secondParam);

$args = [
    $firstParam => 'FOO',
    $secondParam => 'BAR',
];

$m->invokeArgs(function ($bar, $foo) {
	echo "foo: {$foo}, bar: {$bar}\n";
}, $args);
```

Resulted in this output:
```
string(3) "foo"
string(3) "bar"
foo: BAR, bar: FOO
```

But I expected this output instead:

```
string(3) "foo"
string(3) "bar"
Fatal error: Uncaught ReflectionException: Given object is not an instance of the class this method was declared in
```

Semantically closures are behave if they were different, incompatible, classes that extend a `Closure` base class and the `__invoke()` method is defined on the closure-specific class rather than the base class. The observable signature differs for each Closure definition. This is also becoming obvious by `new ReflectionMethod('Closure', '__invoke')` failing when only the classname rather than an object is being provided:

```
Fatal error: Uncaught ReflectionException: Method Closure::__invoke() does not exist in php-src/test6.php:7
Stack trace:
#0 php-src/test6.php(7): ReflectionMethod->__construct('Closure', '__invoke')
#1 {main}
  thrown in php-src/test6.php on line 7
```

### PHP Version

```plain
git master @ f99ca6347f456e18adb22c8c89e92681bb55d84d
```

### Operating System

_No response_
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.