2009-06-03 5 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

필자는 반복 작업을 수행 할 코드를 제어 할 수 없습니다. 그것은 제 3 자 라이브러리이고, 나는 그것으로 멋지게 플레이하기 위해서 나의 프록시를 원한다. 그것은 foreach를 사용합니다. 나는 인터페이스를 구현하는 것이 그 사람이 인터페이스 함수를 사용하도록 반복 할 것을 요구한다고 가정 할까? 아니면 뒤에서 마술을 할 것인가? –

+0

iterator 인터페이스는 마법입니다. foreach()를 객체 위에 사용할 수 있습니다. – Greg

+0

정보를 제공해 주셔서 감사합니다! –

관련 문제