PHP取消设置就像一个参考

时间:2013-10-08 16:58:01

标签: php

我无法理解为什么即使我创建副本,PHP也会为两个对象取消children属性。

当我指定$singleNode = $node时,它不应该删除singleNode子节点,因为我没有传递引用,但它的行为就是这样。

任何人都可以为我解决这个问题吗?

您可以在PHP CLI中运行它以查看我的意思

<?php

$node = new stdClass();
$node->title = 'Test';
$node->children = [1,2,3,4,5];


// Does the node have children?
if (property_exists($node, 'children')) {
    echo '$node has children' . PHP_EOL;
} else {
    echo '$node NOT has children' . PHP_EOL;
}

// Assign node to a new variable, and remove children
$singleNode = $node;
if (property_exists($singleNode, 'children')) {
    echo '$singleNode removed children' . PHP_EOL;
    unset($singleNode->children);
}


// Does the node have children?
if (property_exists($node, 'children')) {
    echo '$node has children' . PHP_EOL;
} else {
    echo '$node NOT has children' . PHP_EOL;
}

我发现我可以这样做:

$singleNode = clone $node

这是正确的方法吗?为什么会这样?无论我将变量分配给什么,变量都引用内存中的相同项目?

1 个答案:

答案 0 :(得分:3)

你只有一个物体。要获得第二个对象,您必须创建clone。技术上$singleNode = $node正在复制仍然引用同一对象的oject句柄。

请参阅 http://php.net/manual/en/language.oop5.cloning.phphttp://php.net/manual/en/language.oop5.references.php