Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除引用“&&引用;来自新对象会导致PHP中出现意外问题_Php - Fatal编程技术网

删除引用“&&引用;来自新对象会导致PHP中出现意外问题

删除引用“&&引用;来自新对象会导致PHP中出现意外问题,php,Php,我正在维护一些遗留代码,并一直在删除对新对象的引用,如: $object = & new SomeObject(); [name] => root [layer] => 0 [children] => Array ( [0] => TreeNode Object ( [subtree] => foo

我正在维护一些遗留代码,并一直在删除对新对象的引用,如:

$object = & new SomeObject();
    [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] => 
                )

        )

)
    [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] => 
                )

        )

)
为此:

$object = new SomeObject();
    [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] => 
                )

        )

)
    [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] => 
                )

        )

)
这一点,尽管事实上它不应该有任何区别,因为PHP5确实把一些事情搞砸了,因为对象不再是引用了。如果更换了
&
,问题就会消失

    [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] => 
                )

        )

)
    [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] => 
                )

        )

)
下面是一个示例代码:

<?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's 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;
}

?>
    [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] => 
                )

        )

)
    [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] => 
                )

        )

)
如果行是
$node=&new TreeNode()输出为:
树状物
(
[子树]=>数组
(
)

    [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] => 
                )

        )

)
    [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] => 
                )

        )

)

事实上,这是一个由更多引用引起的问题。相关代码如下所示:

    [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] => 
                )

        )

)
    [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] => 
                )

        )

)
function &recursiveFunction(&$someobject) {
  $object = & new SomeObject();
  $someobject->recursiveFunction($object);
  return $someobject;
}
从函数和对象使用的任何地方删除引用,最终解决了问题,而不必在创建时也有引用。因此,这只是引用本身的一部分问题,但周围也有其他引用

    [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] => 
                )

        )

)
    [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] => 
                )

        )

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

我仍然有点不确定为什么会发生这种情况,但这可能是PHP内部处理
&$object
的一些问题,仍然与
$object
不同,即使在较新版本中,对象应该始终是对象本身的引用。

内部处理没有任何问题,并且发布了错误(s)下次提问时,您可能会得到一些信息,这些信息可能会帮助其他人告诉您出了什么问题、为什么出了问题以及如何避免。问题是函数似乎会为所有对象返回对同一对象的引用。因此,返回的所有对象最终都是同一对象。我们使用此信息来呈现导航树,并在
&在新节点被删除时,它在所有节点上显示相同的文本和链接,因为所有节点都获得了该函数创建的最后一个节点的内容。如果所有的和都已就位,或者没有一个正确工作。我添加了一些示例代码,展示了相同的问题,以便您可以对其进行实验。这让我感到非常困惑对于使用引用或不使用引用传递的对象,应该不再有任何区别。
    [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] => 
                )

        )

)
    [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] => 
                )

        )

)