Я поддерживаю некоторый унаследованный код, и я удаляю ссылки на новые объекты так:
$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] =>
)
)
)
Фактически это оказалось проблемой, вызванной еще большим количеством ссылок. Этот код выглядел примерно так:
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
даже если в новых версиях объекты всегда должны быть ссылками на сам объект.
&
at нового было удалено, он отображал один и тот же текст и ссылку на всех узлах, поскольку все узлы получили содержимое последнего узла, созданного функцией. Если либо все & находятся на месте, либо ни один из них, это работает правильно.