PHP/MongoDB:PHP中的引用是如何工作的?

4
我在MongoDB用户组中提出了这个问题,但对答案不满意,所以也许在StackOverflow上有人可以启发我:
编辑:
我已经重新编写了我的问题,因为显然不清楚正在发生什么 - 请在回答之前尝试我的测试代码。谢谢!
<?php

// test: a
$data = array('x' => 1);

function a(&$data) {
    $m = new mongo();
    $c = $m->selectDB('test')->selectCollection('test');

    $c->insert($data);
}

a($data);
print_r($data);

// test: b
$data = array('x' => 1);

function b($data) {
    $m = new mongo();
    $c = $m->selectDB('test')->selectCollection('test');

    $c->insert($data);
}

b($data);
print_r($data);

// test: c
$data = array('x' => 1);

function c(&$data) {
    $data['_id'] = new MongoId();
}

c($data);
print_r($data);

// test: d
$data = array('x' => 1);

function d($data) {
    $data['_id'] = new MongoId();
}

d($data);
print_r($data);

?>

输出:

Array
(
    [x] => 1
)

Array
(
    [x] => 1
    [_id] => MongoId Object
        (
        )

)

Array
(
    [x] => 1
    [_id] => MongoId Object
        (
        )

)

Array
(
    [x] => 1
)

我的问题是:为什么Mongo插入中的传引用与普通PHP函数调用表现不同?

谢谢!

2个回答

1

0

当你有类似 $ref = &$someVar 的东西时,$ref 现在引用了 $someVar 中的

编辑:

MongoDB Manual at PHP.net 上说:

示例 #1 MongoCollection::insert() _id example 插入一个对象将向其添加一个 _id 字段,除非它是通过引用传递的

<?php

$a = array('x' => 1);
$collection->insert($a);
var_dump($a)

$b = array('x' => 1);
$ref = &$b;
$collection->insert($ref);
var_dump($ref);

?>

是的,我知道。如果我将$ref传递给一个接受参数作为引用的函数(例如我的测试函数),那么$ref($someVar)可以增加更多数据。但是mongodb-insert不是这样工作的。我的问题是:为什么mongodb-insert方法的行为是这样的? - aurora
Babiker,我明白文档告诉我的内容。感谢你的帮助,但这并没有回答我的问题:我不理解这种行为背后的意义。是谁在幕后进行魔法操作?是谁将_id从$ref中排除在外,为什么这种行为与我的普通PHP测试的行为不同? - aurora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接