diff options
author | Tristan Darricau <github@nicofuma.fr> | 2014-05-21 22:24:48 +0200 |
---|---|---|
committer | Tristan Darricau <github@nicofuma.fr> | 2014-06-14 01:45:17 +0200 |
commit | a4c15bbf4f108604d1839648662f6ef26b77930e (patch) | |
tree | 30bbd84972d843c076bbd4b965f9e3e94ddc0a95 | |
parent | 7642fbbd63e70c55a033503a428a6b206a29efdf (diff) | |
download | forums-a4c15bbf4f108604d1839648662f6ef26b77930e.tar forums-a4c15bbf4f108604d1839648662f6ef26b77930e.tar.gz forums-a4c15bbf4f108604d1839648662f6ef26b77930e.tar.bz2 forums-a4c15bbf4f108604d1839648662f6ef26b77930e.tar.xz forums-a4c15bbf4f108604d1839648662f6ef26b77930e.zip |
[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
-rw-r--r-- | phpBB/phpbb/di/service_collection.php | 79 |
1 files changed, 77 insertions, 2 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 @@ -31,6 +31,28 @@ class service_collection extends \ArrayObject } /** + * {@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 * * @param string $name The service name @@ -38,8 +60,61 @@ class service_collection extends \ArrayObject */ public function add($name) { - $task = $this->container->get($name); + $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); + } - $this->offsetSet($name, $task); + return $task; } } |