Передаются ли объекты в PHP по значению или по ссылке? - PullRequest
18 голосов
/ 10 июля 2009

В этом коде:

<?php
class Foo
{
    var $value;

    function foo($value)
    {
        $this->setValue($value);
    }

    function setValue($value)
    {
        $this->value=$value;
    }
}

class Bar
{
    var $foos=array();

    function Bar()
    {
        for ($x=1; $x<=10; $x++)
        {
            $this->foos[$x]=new Foo("Foo # $x");
        }
    }

    function getFoo($index)
    {
        return $this->foos[$index];
    }

    function test()
    {
        $testFoo=$this->getFoo(5);
        $testFoo->setValue("My value has now changed");
    }
}
?>

Когда метод Bar::test() запущен и он изменяет значение foo # 5 в массиве объектов foo, будет ли затронут действительный foo # 5 в массиве, или переменная $testFoo будет только локальной переменная, которая перестала бы существовать в конце функции?

Ответы [ 3 ]

24 голосов
/ 10 июля 2009

Почему бы не запустить функцию и не выяснить?

$b = new Bar;
echo $b->getFoo(5)->value;
$b->test();
echo $b->getFoo(5)->value;

Для меня приведенный выше код (вместе с вашим кодом) привел к выводу:

Foo #5
My value has now changed

Это не из-за «передачи по ссылке», а из-за «назначения по ссылке». В PHP 5 назначение по ссылке является поведением по умолчанию для объектов. Если вы хотите присвоить значение вместо этого, используйте ключевое слово clone .

18 голосов
/ 10 июля 2009

Вы можете обратиться к http://ca2.php.net/manual/en/language.oop5.references.php для фактического ответа на ваш вопрос.

Одним из ключевых моментов ООП PHP5, который часто упоминается, является то, что «объекты передаются по ссылкам по умолчанию». Это не совсем верно.

Ссылка на PHP - это псевдоним, который позволяет двум разным переменным записывать одно и то же значение. Начиная с PHP5, переменная объекта больше не содержит сам объект в качестве значения. Он содержит только идентификатор объекта, который позволяет методам доступа к объекту найти фактический объект. Когда объект отправляется с помощью аргумента, возвращается или присваивается другой переменной, различные переменные не являются псевдонимами: они содержат копию идентификатора, который указывает на тот же объект.

7 голосов
/ 10 июля 2009

Они передаются по значению в PHP 4 и по ссылке в PHP 5. Чтобы передать объекты по ссылке в PHP 4, необходимо явно пометить их как таковые:

$obj = &new MyObj;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...