代码之家  ›  专栏  ›  技术社区  ›  Sean Clark Hess

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

  •  4
  • Sean Clark Hess  · 技术社区  · 15 年前

    我需要序列化代理类。类使用set和get将值存储在数组中。我希望序列化看起来像是一个平面对象。换句话说,我的课看起来像:

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

    当我说:

    foreach($myProxy as $key)
    

    这有可能吗?

    2 回复  |  直到 15 年前
        1
  •  7
  •   Ayman Hourieh    15 年前
    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 .

    Object Iteration 在php文档中获取更多详细信息。

        2
  •  3
  •   Greg    15 年前

    您要实现 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;
        }
    }