2009-06-03 9 views
4

プロキシクラスをシリアル化する必要があります。クラスは__setと__getを使用して値を配列に格納します。シリアライゼーションは単なる単なるオブジェクトのように見えるようにしたい。言い換えれば、私のクラスは次のようになります。動的プロキシクラスのカスタムforeach結果 - 魔法?

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

と私が言うとき、私は、$データ内のすべてのキーと値を返すためにforeachループをしたい:

foreach($myProxy as $key) 

が可能これますか?

答えて

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; 
} 

出力は次のようになります。246

詳細については、PHPドキュメントのObject Iterationを参照してください。

3

は、次のようなSPL iterator interface

何かを実装する:

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

私は反復処理を行うコードを制御できません。それは第三者の図書館であり、私はプロキシを使いたいと思っています。それはforeachを使います。私は、インタフェースを実装するには、そのインタフェース関数を使用するために反復する必要があると仮定しているのでしょうか、あるいはその背後でいくつかの魔法をしていますか? –

+0

イテレータのインターフェイスは魔法です。オブジェクトにforeach()を使用できます – Greg

+0

情報をありがとうございます! –

関連する問題