Bonsoir,

Dans l'optique de faire une système de lazy loading d'objets liés, j'ai tenté de caser la lazy loading en partant du principe que la méthode getIterator d'une classe implémentant l'interface IteratorAggregate était appelée lorsque la nécessité d'utiliser un itérateur se faisait sentir (donc lors d'un foreach par exemple). D'après mes tests, cette méthode est appelée dès la construction d'une instance.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
abstract class Xtend_Proxy_Abstract
{
	protected $_instance;
 
	protected $_criteria = array();
 
	protected static $_mapperName;
 
	protected static $_mapper;
 
	public function __construct(array $criteria)
	{
		if ( ! isset(static::$_mapper) )
		{
			static::$_mapper = new static::$_mapperName();
			if ( ! static::$_mapper instanceof Xtend_Mapper_Abstract )
			{
				throw new Exception(static::$_mapperName . ' is not a Xtend_Mapper_Abstract instance');
			}
		}
		$this->_criteria = $criteria;
	}
 
	private function _init()
	{
		if ( ! isset($this->_instance) )
		{
			$this->_instance = static::$_mapper->find($this->_criteria);
		}
	}
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
abstract class Xtend_Proxy_AbstractCollection
extends Xtend_Proxy_Abstract
implements IteratorAggregate
{
 
	protected $_collection;
 
	private function _init()
	{
		$this->_collection = static::$_mapper->find($this->_criteria);
	}
 
	public function getIterator()
	{
		if ( ! isset($this->_collection) )
		{
			$this->_init();
		}
		return $this->_iterator = new ArrayIterator($this->_collection);
	}
 
}
Auriez-vous des pistes qui permettrait d'implémenter le lazy loading décrit ci-dessus (càd lorsqu'il est nécessaire de récupérer la data) ? Je suis parti vers l'interface IteratorAggregate par simplicité, ne voyant pas l'intérêt de définir mon propre itérateur, mais je tombe un peu des nues concernant cette méthode getIterator... un peu bizare de l'appeler dès __construct...