动态代理类的自定义foreach结果 - 魔术方法?

时间:2009-06-03 20:27:48

标签: php serialization proxy foreach

我需要序列化一个代理类。该类使用__set和__get在数组中存储值。我希望序列化看起来像是一个扁平的对象。换句话说,我的班级看起来像:

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

我希望foreach循环返回$ data中的所有键和值,当我说:

foreach($myProxy as $key)

这可能吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;
    }
}