Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的对象是通过值还是引用传递的?_Php_Oop - Fatal编程技术网

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

PHP中的对象是通过值还是引用传递的?,php,oop,Php,Oop,在此代码中: <?php class Foo { var $value; function foo($value) { $this->setValue($value); } function setValue($value) { $this->value=$value; } } class Bar { var $foos=array(); function Bar()

在此代码中:

<?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
变量是否只是一个局部变量,在函数末尾将不再存在?

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

$obj = &new MyObj;
关于你问题的实际答案,你可以参考

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

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


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

$b = new Bar;
echo $b->getFoo(5)->value;
$b->test();
echo $b->getFoo(5)->value;
对我来说,上述代码(以及您的代码)产生了以下输出:

Foo #5
My value has now changed

这不是因为“通过引用传递”,而是因为“通过引用分配”。在PHP5中,引用赋值是对象的默认行为。如果要改为按值赋值,请使用关键字。

相关问题:。在PHP4上会发生什么情况?PHP4是否可以配置为以与PHP5相同的方式通过引用进行赋值?是的,可以使用“=&”赋值运算符而不是“=”进行赋值。请阅读:在PHP中,对象不是通过引用分配的,而是表示内存中对象的值(标识符)。即使复制了该值,它仍然很小,PHP在内部始终使用标识符表示的对象。因此,不会复制对象本身,只复制其标识符;)由于通常不鼓励使用引用(因为您需要非常熟悉该语言才能使用它们),只需传递w/o引用即可?