2009-06-03 7 views
4

Je dois sérialiser une classe proxy. La classe utilise __set et __get pour stocker des valeurs dans un tableau. Je veux que la sérialisation ressemble à un objet plat. En d'autres termes, ma classe ressemble à:Résultats foreach personnalisés pour la classe proxy dynamique - méthodes magiques?

class Proxy 
{ 
    public $data = array(); 
    public function __get($name) 
    { 
     return $data[$name] 
    } 
} 

et je veux une boucle foreach pour retourner toutes les clés et les valeurs des données de $, quand je dis:

foreach($myProxy as $key) 

Est-ce possible?

Répondre

7
class Proxy implements IteratorAggregate 
{ 
    public $data = array(); 
    public function __get($name) 
    { 
     return $data[$name]; 
    } 
    public function getIterator() 
    { 
     $o = new ArrayObject($this->data); 
     return $o->getIterator(); 
    } 
} 

$p = new Proxy(); 
$p->data = array(2, 4, 6); 
foreach ($p as $v) 
{ 
    echo $v; 
} 

sortie est: 246. Pour plus de détails, voir Object Iteration dans les documents PHP.

3

Vous voulez mettre en œuvre le SPL iterator interface

Quelque chose comme ceci:

class Proxy implements Iterator 
{ 
    public $data = array(); 

    public function __get($name) 
    { 
     return $data[$name] 
    } 

    function rewind() 
    { 
     reset($this->data); 
     $this->valid = true; 
    } 

    function current() 
    { 
     return current($this->data) 
    } 

    function key() 
    { 
     return key($this->data) 
    } 

    function next() { 
     next($this->data); 
    } 

    function valid() 
    { 
     return key($this->data) !== null; 
    } 
} 
+0

Je n'ai aucun contrôle sur le code qui fera l'itération. C'est une bibliothèque tierce, et je veux que mon proxy joue bien avec. Il utilise un foreach. Ai-je raison de supposer que l'implémentation de l'interface exigerait que la personne itérant utilise les fonctions de l'interface, ou fasse-t-elle un peu de magie en coulisse? –

+0

L'interface de l'itérateur est magique - elle vous permet d'utiliser foreach() sur votre objet – Greg

+0

Merci pour l'info! –

Questions connexes