Подтвердить что ты не робот

Объекты в PHP передаются по значению или ссылке?

В этом коде:

<?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 быть только локальной переменная, которая перестанет существовать в конце функции?

4b9b3361

Ответ 1

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

$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.

Ответ 2

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

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

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

Ответ 3

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

$obj = &new MyObj;