Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 917eaca

Browse files
committed
bug #20847 [Console] fixed BC issue with static closures (araines)
This PR was squashed before being merged into the 2.8 branch (closes #20847). Discussion ---------- [Console] fixed BC issue with static closures | Q | A | ------------- | --- | Branch? | 2.8 | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #20845 | License | MIT | Doc PR | n/a Static closures were unable to be used in Command::setCode since #14431. This change fixes the BC break and ensures static closures can still be used. Edit: It seems the inability to bind static closures was considered a feature in PHP5 but was considered a bug by PHP7. As such, the tests need to work around this fact - but the code can remain the same. This code change can be tidied/removed once Symfony is PHP7+ only. Discussion here: https://bugs.php.net/bug.php?id=64761 https://bugs.php.net/bug.php?id=68792 Commits ------- 3247308 [Console] fixed BC issue with static closures
2 parents e221ac9 + 3247308 commit 917eaca

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

src/Symfony/Component/Console/Command/Command.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,15 @@ public function setCode($code)
283283
if (PHP_VERSION_ID >= 50400 && $code instanceof \Closure) {
284284
$r = new \ReflectionFunction($code);
285285
if (null === $r->getClosureThis()) {
286-
$code = \Closure::bind($code, $this);
286+
if (PHP_VERSION_ID < 70000) {
287+
// Bug in PHP5: https://bugs.php.net/bug.php?id=64761
288+
// This means that we cannot bind static closures and therefore we must
289+
// ignore any errors here. There is no way to test if the closure is
290+
// bindable.
291+
$code = @\Closure::bind($code, $this);
292+
} else {
293+
$code = \Closure::bind($code, $this);
294+
}
287295
}
288296
}
289297

src/Symfony/Component/Console/Tests/Command/CommandTest.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,29 @@ public function testSetCodeBindToClosure($previouslyBound, $expected)
335335
$this->assertEquals('interact called'.PHP_EOL.$expected.PHP_EOL, $tester->getDisplay());
336336
}
337337

338+
public function testSetCodeWithStaticClosure()
339+
{
340+
$command = new \TestCommand();
341+
$command->setCode(self::createClosure());
342+
$tester = new CommandTester($command);
343+
$tester->execute(array());
344+
345+
if (PHP_VERSION_ID < 70000) {
346+
// Cannot bind static closures in PHP 5
347+
$this->assertEquals('interact called'.PHP_EOL.'not bound'.PHP_EOL, $tester->getDisplay());
348+
} else {
349+
// Can bind static closures in PHP 7
350+
$this->assertEquals('interact called'.PHP_EOL.'bound'.PHP_EOL, $tester->getDisplay());
351+
}
352+
}
353+
354+
private static function createClosure()
355+
{
356+
return function (InputInterface $input, OutputInterface $output) {
357+
$output->writeln(isset($this) ? 'bound' : 'not bound');
358+
};
359+
}
360+
338361
public function testSetCodeWithNonClosureCallable()
339362
{
340363
$command = new \TestCommand();

0 commit comments

Comments
 (0)