я реализовал простой композитный образец с использованием SplObjectStorage, как в примере выше:Ошибка сериализация дерева объектов с SplObjectStorage
class Node
{
private $parent = null;
public function setParent(Composite $parent)
{
$this->parent = $parent;
}
}
class Composite extends Node
{
private $children;
public function __construct()
{
$this->children = new SplObjectStorage;
}
public function add(Node $node)
{
$this->children->attach($node);
$node->setParent($this);
}
}
Всякий раз, когда я пытаюсь сериализации композитного объекта, PHP 5.3.2 бросает мне Segmentation Fault
. Это происходит только тогда, когда я добавляю к объекту любое количество узлов любого типа.
Это код обижая:
$node = new Node;
$composite = new Composite;
$composite->add($node);
echo serialize($composite);
Хотя это работает:
$node = new Node;
$composite = new Composite;
echo serialize($composite);
Кроме того, если я реализую композитный шаблон с массивом() вместо SplObjectStorage, все бежит слишком хорошо.
Что я делаю неправильно?
... и метод __wakeup в Composite восстановить родительскую ссылку по телефону SetParent ($ это) на каждый дочерний элемент. – VolkerK
Спасибо! Я думал, что serialize() будет достаточно умен, чтобы справляться со ссылками, но это не так. Я решил это, реализовав интерфейс Serializable в обоих классах. – xPheRe