PHP 中的对象是按值还是按引用分配的?

2022-08-30 14:08:11

在此代码中:

<?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");
    }
}
?>

当该方法运行并更改 foo 对象数组中 foo # 5 的值时,数组中的实际 foo # 5 是否会受到影响,或者该变量将只是一个在函数末尾将不再存在的局部变量?Bar::test()$testFoo


答案 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 OOP经常提到的一个关键点是“默认情况下,对象是通过引用传递的”。这并不完全正确。

PHP 引用是一个别名,它允许两个不同的变量写入相同的值。从 PHP5 开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,该标识符允许对象访问器查找实际对象。当一个对象通过参数发送,返回或分配给另一个变量时,不同的变量不是别名:它们保存指向同一对象的标识符的副本。


推荐