From 5fda717e78950ff634cc74ed51b41650a5882e55 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Thu, 14 Aug 2014 16:35:53 +0200 Subject: [PATCH 1/2] Adding test case to verify that cloned instances should be immutable/independent --- .../InstantiatorTest/InstantiatorTest.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php b/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php index 4f7c821..95282cb 100644 --- a/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php +++ b/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php @@ -139,6 +139,21 @@ public function testInstantiationFromNonExistingClass($invalidClassName) $this->instantiator->instantiate($invalidClassName); } + public function testInstancesAreNotCloned() + { + $className = 'TemporaryClass' . uniqid(); + + eval('namespace ' . __NAMESPACE__ . '; class ' . $className . '{}'); + + $instance = $this->instantiator->instantiate(__NAMESPACE__ . '\\' . $className); + + $instance->foo = 'bar'; + + $instance2 = $this->instantiator->instantiate(__NAMESPACE__ . '\\' . $className); + + $this->assertObjectNotHasAttribute('foo', $instance2); + } + /** * Provides a list of instantiable classes (existing) * From c0302f34ba99ff258e3ba46dba8a22b71a883981 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Thu, 14 Aug 2014 16:38:40 +0200 Subject: [PATCH 2/2] Fixed immutability of the "blueprint" entity used when cloning objects --- src/Doctrine/Instantiator/Instantiator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Doctrine/Instantiator/Instantiator.php b/src/Doctrine/Instantiator/Instantiator.php index d774a19..a4d223a 100644 --- a/src/Doctrine/Instantiator/Instantiator.php +++ b/src/Doctrine/Instantiator/Instantiator.php @@ -71,7 +71,7 @@ public function instantiate($className) // not cloneable if it implements `__clone`, as we want to avoid calling it if (! $reflection->hasMethod('__clone')) { - self::$cachedCloneables[$className] = $instance; + self::$cachedCloneables[$className] = clone $instance; } return $instance;