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

 TSomKes10 июл. 2009 г., 01:54
Связанный вопрос:stackoverflow.com/questions/879/….

Ответы на вопрос(3)

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

One of the key-points of PHP5 OOP that is often mentioned is that "objects are passed by references by default". This is not completely true.

A PHP reference is an alias, which allows two different variables to write to the same value. As of PHP5, an object variable doesn't contain the object itself as value anymore. It only contains an object identifier which allows object accessors to find the actual object. When an object is sent by argument, returned or assigned to another variable, the different variables are not aliases: they hold a copy of the identifier, which points to the same object.

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

$obj = &new MyObj;
 22 сент. 2018 г., 12:38
Так в PHP4 это был неявный клон, когда вы передавали по значению?
Решение Вопроса

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

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

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

Foo #5
My value has now changed

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

 Click Upvote10 июл. 2009 г., 02:25
что происходит с этим на php 4?
 10 июл. 2009 г., 02:35
PHP4 будет вести себя как «клон»
 Click Upvote10 июл. 2009 г., 04:50
Можно ли настроить php 4 для назначения по ссылке так же, как php 5?
 10 июл. 2009 г., 05:02
Да, вы можете сделать это с помощью параметра & apos; = & amp; оператор присваивания вместо «=». Прочитай это:ca2.php.net/manual/en/language.references.whatdo.php
 23 июн. 2012 г., 10:58
В PHP объект не присваивается по ссылке, но является значением, представляющим объект в памяти (идентификатор). Несмотря на то, что это значение скопировано, оно маленькое, и PHP внутри него всегда использует этот объект, представленный идентификатором. Таким образом, сам объект не копируется, только его идентификатор;) Поскольку использование ссылок, как правило, не рекомендуется (поскольку вам нужно хорошо знать язык, чтобы использовать их), просто передайте ссылку без ссылки.

Ваш ответ на вопрос