he implementado un patrón Composite simple usando SplObjectStorage, como el ejemplo anterior:Error serialización de un árbol de objetos con 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);
}
}
Siempre que trato de serializar un objeto compuesto, PHP 5.3.2 me lanza una Segmentation Fault
. Esto solo ocurre cuando agrego cualquier cantidad de nodos de cualquier tipo al objeto.
Este es el código erróneo:
$node = new Node;
$composite = new Composite;
$composite->add($node);
echo serialize($composite);
Aunque éste funciona:
$node = new Node;
$composite = new Composite;
echo serialize($composite);
Además, si puedo implementar el patrón Composite con array() en lugar de SplObjectStorage, todas las carreras bien también.
¿Qué estoy haciendo mal?
... y el método de __wakeup compuesto para restaurar la referencia de los padres llamando setParent ($ this) en cada elemento hijo. – VolkerK
Gracias! Pensé que serialize() sería lo suficientemente inteligente como para tratar con referencias, pero no lo es. Lo resolví implementando la interfaz Serializable en ambas clases. – xPheRe