[Console][Command] Fix Closure code binding when it is a static anonymous function

This commit is contained in:
Thomas Calvet 2021-01-22 09:23:15 +01:00
parent 039fe6ab86
commit 18d426871e
2 changed files with 20 additions and 1 deletions

View File

@ -281,7 +281,14 @@ class Command
if ($code instanceof \Closure) {
$r = new \ReflectionFunction($code);
if (null === $r->getClosureThis()) {
$code = \Closure::bind($code, $this);
set_error_handler(static function () {});
try {
if ($c = \Closure::bind($code, $this)) {
$code = $c;
}
} finally {
restore_error_handler();
}
}
}

View File

@ -398,6 +398,18 @@ class CommandTest extends TestCase
{
$output->writeln('from the code...');
}
public function testSetCodeWithStaticAnonymousFunction()
{
$command = new \TestCommand();
$command->setCode(static function (InputInterface $input, OutputInterface $output) {
$output->writeln(isset($this) ? 'bound' : 'not bound');
});
$tester = new CommandTester($command);
$tester->execute([]);
$this->assertEquals('interact called'.\PHP_EOL.'not bound'.\PHP_EOL, $tester->getDisplay());
}
}
// In order to get an unbound closure, we should create it outside a class