Поведение аргументов объекта PHP - PullRequest
0 голосов
/ 16 февраля 2011

Возьмем такую ​​ситуацию:

function edit($var)
{
    $var->test = "foo";
}

$obj = new stdClass;
edit($obj);

echo $obj->test; //"foo"

Функция редактирования не принимает аргумент в качестве ссылки и не должна изменять исходный объект, так почему это происходит?

Ответы [ 2 ]

4 голосов
/ 16 февраля 2011

Поскольку в PHP 5 ссылки на объекты передаются по значению, а не самим объектам. Это означает, что аргумент вашей функции $var и переменная вызывающей области действия $obj являются различными ссылками на один и тот же объект. Эта ручная запись может вам помочь.

Чтобы получить (мелкую) копию вашего объекта, используйте clone. Однако для получения этой копии вам необходимо вернуть ее:

function edit($var)
{
    $clone = clone $var;
    $clone->test = "foo";
    return $clone;
}

$obj = new stdClass;
$obj2 = edit($obj);

echo $obj2->test;

Или присвойте его ссылочному аргументу , а затем назовите его так:

function edit($var, &$clone)
{
    $clone = clone $var;
    $clone->test = "foo";
}

$obj = new stdClass;
edit($obj, $obj2);

echo $obj2->test;
1 голос
/ 16 февраля 2011

Атрибуты классов в php (а также других языках, таких как javascript) всегда передаются как ссылки

...