Проблема ручной сериализации в PHP - PullRequest
0 голосов
/ 22 мая 2009

В моей задаче было бы очень неплохо написать некий объект сериализации (для вывода XML). Я уже сделал это, но понятия не имею, как избежать рекурсивных ссылок.

Проблема в том, что некоторые объекты должны иметь публичные (!) Свойства со ссылками на своих родителей (это действительно необходимо). И когда я пытаюсь сериализовать родительский объект, который объединяет несколько дочерних элементов, дочерние элементы со ссылками на родительские объекты выполняют рекурсию навсегда.

Есть ли решение для обработки таких рекурсий, как print_r () обходится без хаков? Я не могу использовать что-то вроде «if ($ prop === 'parent')», потому что иногда существует более 1 ссылки на родителей из разных контекстов.

1 Ответ

1 голос
/ 22 мая 2009

Напишите свою собственную функцию сериализации и всегда передавайте ей список уже обработанных предметов. Поскольку PHP5 (я полагаю, вы используете php5) всегда копирует ссылки на объект, вы можете сделать следующее:

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
    # ...
}
...