在PHP对象通过值或引用传递?(Are objects in PHP passed by value

2019-06-25 13:22发布

在这样的代码:

<?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的对象的阵列中的改变的FOO#5的值,将所述阵列中的实际FOO#5受到影响,或者将$testFoo变量是仅一个局部变量这将停止在函数结束时存在吗?

Answer 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中按引用赋值,与对象的默认行为。 如果要通过值,而不是分配,使用克隆关键字。



Answer 2:

您可以参考http://ca2.php.net/manual/en/language.oop5.references.php的实际回答你的问题。

一个经常被提及的PHP5 OOP的关键点之一是“对象是通过引用传递默认”。 这并不完全正确。

甲PHP参考是一个别名,它允许两个不同的变量写入到相同的值。 作为PHP5的,对象变量不包含对象本身作为值了。 它仅包含对象标识符,它允许对象存取找到实际的对象。 当对象是由参数,返回或分配给另一个变量发送时,不同的变量不是别名:其所持有的标识符,它指向相同的对象的副本。



Answer 3:

它们是由值在PHP 4,并通过引用在PHP 5中传递为了通过引用传递对象在PHP 4,你必须明确地将其标记为这样的:

$obj = &new MyObj;


文章来源: Are objects in PHP passed by value or reference?
标签: php oop