Пользовательские результаты foreach для динамического класса прокси - магические методы - PullRequest
4 голосов
/ 04 июня 2009

Мне нужно сериализовать прокси-класс. Класс использует __set и __get для хранения значений в массиве. Я хочу, чтобы сериализация выглядела как плоский объект. Другими словами, мой класс выглядит так:

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

и я хочу, чтобы цикл foreach возвращал все ключи и значения в $ data, когда я говорю:

foreach($myProxy as $key)

Возможно ли это?

Ответы [ 2 ]

7 голосов
/ 04 июня 2009
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.

3 голосов
/ 04 июня 2009

Вы хотите реализовать интерфейс итератора SPL

Примерно так:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...