camka
не самка
unserialize и ссылки на себя
Если у массива имеются ссылки на самого себя, то при сериализации и последующей десериализации эти ссылки каким-то образом портятся.
При извлеченном из файла объекте в итоге получаем
То бишь, ссылка на родителя теряется, поскольку сама переменная $root переопределена.
Однако, при инициализации переменной непосредственно в ходе программы, ссылочная целостность остается в норме:
Меня интересует, является ли подобное поведение естественным для ПХП, или же стоит заслать баг-репорт?
P.S.: ПХП 5.0.5
Если у массива имеются ссылки на самого себя, то при сериализации и последующей десериализации эти ссылки каким-то образом портятся.
PHP:
<?php
class test
{
public $children = array(); // массив детей
public $parent = null; // ссылка на родителя
public $id = 0; // уникальный идентификатор узла
public function __construct($id)
{
$this->id = $id;
}
public function add_child(test $child)
{
$this->children[] = $child;
$child->parent = $this;
}
}
$filename = '/tmp/fdfd.txt';
if (is_readable($filename)) // если файл существует
{
// Достаем объект из файла и десериализуем
$root = unserialize(file_get_contents($filename));
unlink($filename);
}
else
{
// Есле файла нет, создаем новый объект и
// аккуратно складываем его в файл в сериализованном виде
$root = new test('root');
$root->add_child($child1 = new test('child'));
file_put_contents($filename, serialize($root));
}
// Изменяем текущий узел
$root = $root->children[0]; // $root =& $root->children[0];
echo "<pre>";
var_dump($root);
?>
Код:
object(test)#2 (3) {
["children"]=>
array(0) {
}
["parent"]=>
NULL
["id"]=>
string(5) "child"
}
Однако, при инициализации переменной непосредственно в ходе программы, ссылочная целостность остается в норме:
Код:
object(test)#2 (3) {
["children"]=>
array(0) {
}
["parent"]=>
object(test)#1 (3) {
["children"]=>
array(1) {
[0]=>
object(test)#2 (3) {
["children"]=>
array(0) {
}
["parent"]=>
object(test)#1 (3) {
["children"]=>
array(1) {
[0]=>
*RECURSION*
}
["parent"]=>
NULL
["id"]=>
string(4) "root"
}
["id"]=>
string(5) "child"
}
}
["parent"]=>
NULL
["id"]=>
string(4) "root"
}
["id"]=>
string(5) "child"
}
P.S.: ПХП 5.0.5