2009-06-03 3 views
4

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

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

и я хочу цикл Еогеасп вернуть все ключи и значения в $ данных, когда я говорю:

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.

См. Object Iteration в документах PHP для получения более подробной информации.

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

Спасибо за информацию! –

Смежные вопросы