从新对象中删除引用“&”会导致 PHP 中出现意外问题
Removing reference "&" from new Object causes unexpected issues in PHP
我正在维护一些遗留代码,并且一直在删除对新对象的引用,例如:
$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'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;
}
?>
如果行是$node = new TreeNode();
,输出是:
树节点对象
(
[subtree] => 数组
(
)
[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();
输出是:
树节点对象
(
[subtree] => 数组
(
)
[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;
}
从函数中删除引用并在使用该对象的所有地方最终解决了问题,而不必在创建时也有引用。所以这只是参考本身的部分问题,但其他参考也是如此。
function recursiveFunction($someobject) {
$object = new SomeObject();
$someobject->recursiveFunction($object);
return $someobject;
}
我仍然有点不确定为什么会发生这种情况,但这可能是 PHP 内部处理的一些问题 &$object
仍然不同于 $object
即使在较新的版本中也是如此对象应该始终是对象本身的引用。
我正在维护一些遗留代码,并且一直在删除对新对象的引用,例如:
$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'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;
}
?>
如果行是$node = new TreeNode();
,输出是:
树节点对象
(
[subtree] => 数组
(
)
[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();
输出是:
树节点对象
(
[subtree] => 数组
(
)
[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;
}
从函数中删除引用并在使用该对象的所有地方最终解决了问题,而不必在创建时也有引用。所以这只是参考本身的部分问题,但其他参考也是如此。
function recursiveFunction($someobject) {
$object = new SomeObject();
$someobject->recursiveFunction($object);
return $someobject;
}
我仍然有点不确定为什么会发生这种情况,但这可能是 PHP 内部处理的一些问题 &$object
仍然不同于 $object
即使在较新的版本中也是如此对象应该始终是对象本身的引用。