Skip to content
This repository was archived by the owner on Feb 6, 2020. It is now read-only.

Commit 2234f10

Browse files
author
Moln
committed
1 parent 3b005cb commit 2234f10

File tree

3 files changed

+46
-11
lines changed

3 files changed

+46
-11
lines changed

src/ServiceManager.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,13 @@ class ServiceManager implements ServiceLocatorInterface
134134
*/
135135
protected $configured = false;
136136

137+
/**
138+
* Cached abstract factories from string.
139+
*
140+
* @var array
141+
*/
142+
private $cachedAbstractFactories = [];
143+
137144
/**
138145
* Constructor.
139146
*
@@ -486,12 +493,17 @@ private function resolveAbstractFactories(array $abstractFactories)
486493
{
487494
foreach ($abstractFactories as $abstractFactory) {
488495
if (is_string($abstractFactory) && class_exists($abstractFactory)) {
489-
$abstractFactory = new $abstractFactory();
496+
//Cached string
497+
if (!isset($this->cachedAbstractFactories[$abstractFactory])) {
498+
$this->cachedAbstractFactories[$abstractFactory] = new $abstractFactory();
499+
}
500+
501+
$abstractFactory = $this->cachedAbstractFactories[$abstractFactory];
490502
}
491503

492504
if ($abstractFactory instanceof AbstractFactoryInterface) {
493-
$abstractFactoryClassName = get_class($abstractFactory);
494-
$this->abstractFactories[$abstractFactoryClassName] = $abstractFactory;
505+
$abstractFactoryObjHash = spl_object_hash($abstractFactory);
506+
$this->abstractFactories[$abstractFactoryObjHash] = $abstractFactory;
495507
continue;
496508
}
497509

test/CommonServiceLocatorBehaviorsTrait.php

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
use Zend\ServiceManager\Factory\InvokableFactory;
2222
use Zend\ServiceManager\Initializer\InitializerInterface;
2323
use Zend\ServiceManager\ServiceLocatorInterface;
24-
use ZendTest\ServiceManager\TestAsset\CallOnlyOnceAbstractFactory;
24+
use ZendTest\ServiceManager\TestAsset\CallTimesAbstractFactory;
2525
use ZendTest\ServiceManager\TestAsset\FailingAbstractFactory;
2626
use ZendTest\ServiceManager\TestAsset\FailingFactory;
2727
use ZendTest\ServiceManager\TestAsset\InvokableObject;
@@ -140,20 +140,43 @@ public function testCanCreateServiceWithAbstractFactory()
140140
$serviceManager->get(DateTime::class);
141141
}
142142

143-
public function testCallOnlyOnceWithMultipleIdenticalAbstractFactory()
143+
public function testCallTwiceWithDifferentInstanceAbstractFactories()
144144
{
145-
CallOnlyOnceAbstractFactory::setCallTimes(0);
145+
CallTimesAbstractFactory::setCallTimes(0);
146+
147+
$obj1 = new CallTimesAbstractFactory();
148+
$obj2 = new CallTimesAbstractFactory();
149+
150+
$serviceManager = $this->createContainer([
151+
'abstract_factories' => [
152+
$obj1,
153+
$obj2,
154+
]
155+
]);
156+
$serviceManager->addAbstractFactory($obj1);
157+
$serviceManager->addAbstractFactory($obj2);
158+
$serviceManager->has(stdClass::class);
159+
160+
$this->assertEquals(2, CallTimesAbstractFactory::getCallTimes());
161+
}
162+
163+
/**
164+
* A new test with the same instance of `CallTimesAbstractFactory` should be provided.
165+
*/
166+
public function testCallOnlyOnceWithSameInstanceAbstractFactory()
167+
{
168+
CallTimesAbstractFactory::setCallTimes(0);
146169

147170
$serviceManager = $this->createContainer([
148171
'abstract_factories' => [
149-
new CallOnlyOnceAbstractFactory(),
150-
new CallOnlyOnceAbstractFactory(),
172+
CallTimesAbstractFactory::class,
173+
CallTimesAbstractFactory::class,
151174
]
152175
]);
153-
$serviceManager->addAbstractFactory(CallOnlyOnceAbstractFactory::class);
176+
$serviceManager->addAbstractFactory(CallTimesAbstractFactory::class);
154177
$serviceManager->has(stdClass::class);
155178

156-
$this->assertEquals(1, CallOnlyOnceAbstractFactory::getCallTimes());
179+
$this->assertEquals(1, CallTimesAbstractFactory::getCallTimes());
157180
}
158181

159182
public function testCanCreateServiceWithAlias()

test/TestAsset/CallOnlyOnceAbstractFactory.php renamed to test/TestAsset/CallTimesAbstractFactory.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
use Interop\Container\ContainerInterface;
1313
use Zend\ServiceManager\Factory\AbstractFactoryInterface;
1414

15-
class CallOnlyOnceAbstractFactory implements AbstractFactoryInterface
15+
class CallTimesAbstractFactory implements AbstractFactoryInterface
1616
{
1717
protected static $callTimes = 0;
1818

0 commit comments

Comments
 (0)