Удаление ссылки «&» из нового объекта вызывает непредвиденные проблемы в PHP

0

Я поддерживаю некоторый унаследованный код, и я удаляю ссылки на новые объекты так:

$object = & new SomeObject();

к этому:

$object = new SomeObject();

И это, несмотря на то, что это не должно иметь никакого значения, поскольку PHP5 действительно испортил некоторые вещи довольно плохо, поскольку объект вообще не является ссылкой. Если & заменено там, проблемы исчезают.

Вот пример кода:

<?php

class TreeNode
{
    public $subtree;
    public $name;
    public $layer;
    public $children;

    function &addNode(&$node)
    {
        $this->children[] = &$node;
    }

}

$subtree = array(array('bla','blubb'), 'foo');

$tree = new TreeNode();
$tree->subtree = $subtree;
$tree->layer = 0;
$tree->name = 'root';

$b = buildTree($tree);

print_r($b);

function &buildTree(&$tree) {
    if(is_array($tree->subtree))
    {
        foreach($tree->subtree as $key => $subtree)
        {
            $node = new TreeNode(); ///#### This line is a toggle and it unknown why
            $node->layer = $tree->layer + 1;
            $node->subtree = $subtree;
            $tree->addNode( buildTree($node) );
            unset($tree->subtree[$key]);
        }
    }
    else
    {
        $tree->name = $tree->subtree;
    }

    return $tree;
}

?>

Если строка $node = new TreeNode(); , вывод: TreeNode Object ([поддерево] => Массив()

    [name] => root
    [layer] => 0
    [children] => Array
        (
            [0] => TreeNode Object
                (
                    [subtree] => foo
                    [name] => foo
                    [layer] => 1
                    [children] => 
                )

            [1] => TreeNode Object
                (
                    [subtree] => foo
                    [name] => foo
                    [layer] => 1
                    [children] => 
                )

        )

)

Если строка $node = & new TreeNode(); вывод: TreeNode Object ([поддерево] => Массив()

    [name] => root
    [layer] => 0
    [children] => Array
        (
            [0] => TreeNode Object
                (
                    [subtree] => Array
                        (
                        )

                    [name] => 
                    [layer] => 1
                    [children] => Array
                        (
                            [0] => TreeNode Object
                                (
                                    [subtree] => bla
                                    [name] => bla
                                    [layer] => 2
                                    [children] => 
                                )

                            [1] => TreeNode Object
                                (
                                    [subtree] => blubb
                                    [name] => blubb
                                    [layer] => 2
                                    [children] => 
                                )

                        )

                )

            [1] => TreeNode Object
                (
                    [subtree] => foo
                    [name] => foo
                    [layer] => 1
                    [children] => 
                )

        )

)
Теги:

1 ответ

0
Лучший ответ

Фактически это оказалось проблемой, вызванной еще большим количеством ссылок. Этот код выглядел примерно так:

function &recursiveFunction(&$someobject) {
  $object = & new SomeObject();
  $someobject->recursiveFunction($object);
  return $someobject;
}

И удаление ссылок из функции и везде, где использовался объект, решило проблемы, наконец, без необходимости ссылаться на создание. Так что это была лишь часть проблемы самой ссылки, но и других ссылок.

function recursiveFunction($someobject) {
  $object = new SomeObject();
  $someobject->recursiveFunction($object);
  return $someobject;
}

Я все еще не уверен, почему именно это произошло, но, вероятно, проблема с обработкой PHP &$object прежнему отличается от $object даже если в новых версиях объекты всегда должны быть ссылками на сам объект.

  • 0
    Нет никаких проблем с внутренней обработкой, и публикация ошибок, которые вы получите в следующий раз, когда будете задавать вопросы, может помочь другим рассказать вам, что пошло не так, почему пошло не так и как этого избежать.
  • 0
    Проблема заключалась в том, что функция, казалось бы, возвращала ссылку на один и тот же объект для всех объектов. Таким образом, все возвращаемые объекты будут одним и тем же объектом в конце. Мы использовали это для рендеринга дерева навигации, и когда & at нового было удалено, он отображал один и тот же текст и ссылку на всех узлах, поскольку все узлы получили содержимое последнего узла, созданного функцией. Если либо все & находятся на месте, либо ни один из них, это работает правильно.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню