diff --git a/src/Symfony/Component/OptionsResolver/OptionsResolver.php b/src/Symfony/Component/OptionsResolver/OptionsResolver.php index 1ead9c2820..6542e9a0ad 100644 --- a/src/Symfony/Component/OptionsResolver/OptionsResolver.php +++ b/src/Symfony/Component/OptionsResolver/OptionsResolver.php @@ -67,6 +67,14 @@ class OptionsResolver implements OptionsResolverInterface $this->defaultOptions = new Options(); } + /** + * Clones the resolver. + */ + public function __clone() + { + $this->defaultOptions = clone $this->defaultOptions; + } + /** * {@inheritdoc} */ @@ -210,7 +218,7 @@ class OptionsResolver implements OptionsResolverInterface /** * {@inheritdoc} */ - public function resolve(array $options) + public function resolve(array $options = array()) { $this->validateOptionsExistence($options); $this->validateOptionsCompleteness($options); diff --git a/src/Symfony/Component/OptionsResolver/OptionsResolverInterface.php b/src/Symfony/Component/OptionsResolver/OptionsResolverInterface.php index 27f4f84450..734a14d8de 100644 --- a/src/Symfony/Component/OptionsResolver/OptionsResolverInterface.php +++ b/src/Symfony/Component/OptionsResolver/OptionsResolverInterface.php @@ -206,5 +206,5 @@ interface OptionsResolverInterface * @throws Exception\OptionDefinitionException If a cyclic dependency is detected * between two lazy options. */ - public function resolve(array $options); + public function resolve(array $options = array()); } diff --git a/src/Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php b/src/Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php index d112dd30f8..d755b6baae 100644 --- a/src/Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php +++ b/src/Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php @@ -612,4 +612,25 @@ class OptionsResolverTest extends \PHPUnit_Framework_TestCase $this->assertEquals($options, $this->resolver->resolve($options)); } + + public function testClone() + { + $this->resolver->setDefaults(array('one' => '1')); + + $clone = clone $this->resolver; + + // Changes after cloning don't affect each other + $this->resolver->setDefaults(array('two' => '2')); + $clone->setDefaults(array('three' => '3')); + + $this->assertEquals(array( + 'one' => '1', + 'two' => '2', + ), $this->resolver->resolve()); + + $this->assertEquals(array( + 'one' => '1', + 'three' => '3', + ), $clone->resolve()); + } }