From a4c15bbf4f108604d1839648662f6ef26b77930e Mon Sep 17 00:00:00 2001 From: Tristan Darricau Date: Wed, 21 May 2014 22:24:48 +0200 Subject: [PATCH] [ticket/12575] Speed up load_class() Load the services referenced in a service_collection only when they are used to avoid to load some unsuded services. PHPBB3-12575 --- phpBB/phpbb/di/service_collection.php | 81 ++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 3 deletions(-) diff --git a/phpBB/phpbb/di/service_collection.php b/phpBB/phpbb/di/service_collection.php index 3a18644891..f0b387a5b1 100644 --- a/phpBB/phpbb/di/service_collection.php +++ b/phpBB/phpbb/di/service_collection.php @@ -30,6 +30,28 @@ class service_collection extends \ArrayObject $this->container = $container; } + /** + * {@inheritdoc} + */ + public function getIterator() + { + return new service_collection_iterator($this->container, $this); + } + + /** + * {@inheritdoc} + */ + public function offsetGet($index) + { + if (($task = parent::offsetGet($index)) == null) + { + $task = $this->container->get($index); + $this->offsetSet($index, $task); + } + + return $task; + } + /** * Add a service to the collection * @@ -38,8 +60,61 @@ class service_collection extends \ArrayObject */ public function add($name) { - $task = $this->container->get($name); - - $this->offsetSet($name, $task); + $this->offsetSet($name, null); + } +} + + +/** +* Iterator which load the services when they are requested +* +* @package phpBB3 +*/ +class service_collection_iterator extends \ArrayIterator +{ + protected $container; + + /** + * Construct an ArrayIterator for service_collection + * + * @param ContainerInterface $container Container object + * @param array $array The array or object to be iterated on. + * @param int $flags Flags to control the behaviour of the ArrayObject object. + * @see ArrayObject::setFlags() + */ + public function __construct(ContainerInterface $container, $array = array() , $flags = 0) + { + parent::__construct($array, $flags); + $this->container = $container; + } + + /** + * {@inheritdoc} + */ + public function offsetGet($index) + { + if (($task = parent::offsetGet($index)) == null) + { + $task = $this->container->get($index); + $this->offsetSet($index, $task); + } + + return $task; + } + + + /** + * {@inheritdoc} + */ + public function current() + { + if (($task = parent::current()) == null) + { + $name = $this->key(); + $task = $this->container->get($name); + $this->offsetSet($name, $task); + } + + return $task; } }