代码之家  ›  专栏  ›  技术社区  ›  Ali

PHP中的对象是通过值或引用传递的吗?

  •  17
  • Ali  · 技术社区  · 15 年前

    在本代码中:

    <?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 变量只是一个局部变量,在函数结束时它将不再存在?

    3 回复  |  直到 15 年前
        1
  •  24
  •   Paige Ruten    15 年前

    为什么不运行函数并找出答案呢?

    $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
  •  15
  •   tomzx    15 年前

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

    经常提到的php5 oop的一个关键点是“默认情况下对象是由引用传递的”。这不是完全正确的。

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

        3
  •  7
  •   Emil H    15 年前

    它们在php 4中按值传递,在php 5中按引用传递。为了在php 4中通过引用传递对象,必须显式地将其标记为:

    $obj = &new MyObj;