2009-05-22 6 views
0

내 작업에서 객체 직렬화 (XML 출력)를 작성하는 것이 좋을 것입니다. 나는 이미 해봤지만 재귀 적 링크를 피하는 법을 모릅니다.PHP의 수작업 직렬화 문제

문제는 일부 개체는 부모 (사실 nessecary)에 대한 링크가있는 공용 (!) 속성을 가져야한다는 것입니다. 그리고 일부 자식을 모으는 부모 객체를 직렬화하려고하면 부모 링크가있는 자식이 재귀를 영원히 수행합니다.

해킹없이 print_r()과 같은 재귀를 처리하는 솔루션이 있습니까? "if ($ prop === 'parent')"와 같은 것을 사용할 수 없습니다. 때때로 다른 컨텍스트의 부모에게 링크가 둘 이상 있기 때문입니다.

답변

1

사용자 고유의 직렬화 기능을 작성하고 항상 이미 처리 된 항목의 목록을 전달하십시오.

public function __sleep() { 
    return $this->serialize(); 
} 
protected function serialize($processed = array()) { 
    if (($position = array_search($this, $processed, true)) !== false) { 
     # This object has already been processed, you can use the 
     # $position of this object in the $processed array to reference it. 
     return; 
    } 
    $processed[] = $this; 
    # do your actual serialization here 
    # ... 
} 
+0

가 nitpicker 아니라,하지만 물론해야한다 : 반환 $ this-> 직렬화 PHP5 (나는 당신이 PHP5를 사용하고, 가정) 개체에 항상 복사 참조 때문에, 당신은 다음과 같은 작업을 수행 할 수(); – n3rd

+0

나 한테 수치심 ... 이미 사용 된 인스턴스 목록은 꽤 좋은 해결책입니다! 외부에서조차도 할 수 있고 모든 클래스에 직렬화 메서드를 제공 할 필요가 없습니다. 대단히 감사합니다. PS : btw, 물론 php5입니다. OOP에 대한 php4 질문에서 한 수준 더러운 IMHO 있습니다. – Jet

+0

@ n3rd : thx, fixed – soulmerge