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

Posted

技术标签:

【中文标题】PHP 中的对象是按值分配还是按引用分配?【英文标题】:Are objects in PHP assigned by value or reference? 【发布时间】:2020-04-17 20:03:46 【问题描述】:

在这段代码中:

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

【问题讨论】:

相关问题:***.com/questions/879/…. 【参考方案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 关键字。

【讨论】:

在 php 4 上会发生什么? php 4可以配置成和php 5一样通过引用进行赋值吗? 是的,您可以使用 '=&' 赋值运算符而不是 '=' 来实现。阅读:ca2.php.net/manual/en/language.references.whatdo.php 在 PHP 中,对象不是通过引用分配的,但它们是表示内存中对象的值(标识符)。即使该值被复制,它也很小,并且 PHP 在内部总是使用标识符表示的那个对象。所以对象本身不会被复制,只是它的标识符;)通常不鼓励使用引用(因为您需要非常了解语言才能使用它们),只需传递 w/o 引用。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

它们在 PHP 4 中通过值传递,在 PHP 5 中通过引用传递。为了在 PHP 4 中通过引用传递对象,您必须明确标记它们:

$obj = &new MyObj;

【讨论】:

所以在 PHP4 中当你通过值传递时它是一个隐式克隆?

以上是关于PHP 中的对象是按值分配还是按引用分配?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中克隆对象数组?

PHP 变量是按值传递还是按引用传递?

通过取消引用 NULL 指针来分配引用

JavaScript 是按引用传递还是按值传递语言?

java中的参数传递是按引用传递还是按值传递

Objective-C 对象是按值传递还是按引用传递?