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 中的对象是按值分配还是按引用分配?的主要内容,如果未能解决你的问题,请参考以下文章