IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Interface IteratorAggregate et getIterator [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Par défaut Interface IteratorAggregate et getIterator
    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...

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Par défaut
    Bonjour,
    Si la question n'est pas assez précise ou claire, ne pas hésiter à me demander des précisions

    (sous réserve que ce sujet intéresse quelqu'un ^^)

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Bizarre, moi elle n'est pas appellée au moment du __construct

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Test implements \IteratorAggregate
    {
        public function getIterator()
        {
            var_dump(__METHOD__);
            return new \ArrayIterator(array());
        }
    }
     
    $test = new Test();
     
    foreach ($test as $val);

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Par défaut
    Doh... je ne vois pas pourquoi ça fonctionnerait autrement que comme vous le signalez, c'est pour cela que j'étais particulièrement circonspect...

    Je vais revérifier mes tests, peut-être ai-je une grosse poutre dans l'oeil que je ne verrais pas ^^ Avec un debug_backtrace je devrais avoir la certitude du cheminement

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Par défaut
    Très bien j'ai ma réponse et comme souvent dans ce genre de cas, il s'agit d'une poutre que je ne voyais pas
    Pour faire simple, dès l'objet construit, il était passé en paramètre d'une méthode qui s'empressait de le parcourir, chose que j'avais totalement zappé. Ce sujet est donc résolu et son utilité est très... discutable

    Merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB6] [Interface] ComboBox à plusieurs colonnes
    Par mtl dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/03/2004, 18h35
  2. [VB6] [Interface] Horloge 7 segments
    Par selenay dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 07/10/2002, 17h15
  3. interface utilisateur avec OpenGL
    Par demis20 dans le forum OpenGL
    Réponses: 6
    Dernier message: 03/10/2002, 13h27
  4. [VB6] [Interface] Tester le Type de Controle
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 16/09/2002, 10h51
  5. [VB6] [Interface] Icones de boutons de barre d'outils
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 13/09/2002, 16h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo