gpt4 book ai didi

php - 使用 SplObjectStorage 序列化对象树时出错

转载 作者:可可西里 更新时间:2023-11-01 13:51:43 29 4
gpt4 key购买 nike

我已经使用 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);

此外,如果我使用 array() 而不是 SplObjectStorage 实现复合模式,所有运行也都正常。

我做错了什么?

最佳答案

通过设置Parent,你就有了一个循环引用。 PHP 将尝试序列化复合体,它的所有节点和节点将依次尝试序列化复合体……砰!

你可以使用魔法 __sleep and __wakeup()序列化时删除(或对父引用执行任何操作)的方法。

编辑:

看看将这些添加到 Composite 是否可以解决问题:

public function __sleep()
{
$this->children = iterator_to_array($this->children);
return array('parent', 'children');
}
public function __wakeup()
{
$storage = new SplObjectStorage;
array_map(array($storage, 'attach'), $this->children);
$this->children = $storage;
}

关于php - 使用 SplObjectStorage 序列化对象树时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3583667/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com