- assert: documentation ( source)
- unserialize: documentation ( source)
- serialize: documentation ( source)
- array_keys: documentation ( source)
- get_object_vars: documentation ( source)
<?php
class Item
{
public ?array $children = [];
public ?Item $parent = null;
public function addChild(Item $item): Item
{
$item->setParent($this);
$this->children[] = $item;
return $this;
}
public function setParent(Item $parent): void
{
$this->parent = $parent;
}
public function __sleep()
{
return array_keys(get_object_vars($this));
}
}
class Tree
{
public array $items = [];
public function addItem(Item $item): self
{
$this->items[] = $item;
return $this;
}
public function __clone()
{
foreach ($this->items as $key => $item) {
$clone = clone $item;
$this->items[$key] = $clone;
}
}
}
class Forest
{
public Tree $first;
public Tree $second;
public function __construct(Tree $first, Tree $second)
{
$this->first = $first;
$this->second = $second;
}
}
$charge = new Item();
$baseProduct = new Item();
$base = new Tree();
$base->addItem($baseProduct);
$baseProduct->addCHild($charge);
$second = clone $base;
$data = new Forest($second, $base);
assert(is_array($data->second->items[0]->children));
$data = unserialize(serialize($data));
assert(is_array($data->second->items[0]->children));
echo 'OK';