php / mongodb: как ссылки работают в php? - PullRequest
4 голосов
/ 08 июня 2010

Я спросил это в группе пользователей 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
)

мой вопрос: почему передача по ссылке явно отличается для вставки монго по сравнению с моим простым вызовом функции php?

спасибо!

Ответы [ 2 ]

1 голос
/ 22 октября 2011

Кристина Чодоров, автор расширения php mongoDB, написала в своем блоге хорошую статью об этой проблеме:

http://www.snailinaturtleneck.com/blog/2011/09/07/more-php-internals-references/

, на мой взгляд, она разъясняет, как все работаетphp, я до сих пор думаю, что ссылки в php действительно неловкие ...

0 голосов
/ 08 июня 2010

Когда у вас есть что-то вроде $ref = &$someVar. $ref теперь относится к значению в $someVar.

EDIT:

В руководстве MongoDB на PHP.net написано:

Пример # 1 Пример MongoCollection :: insert () _id Вставка объекта добавит к нему поле _id, , если оно не передано по ссылке .

<?php

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

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

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...