提问人:Ali 提问时间:7/10/2009 最后编辑:AbraCadaverAli 更新时间:10/12/2021 访问量:36135
PHP 中的对象是由值还是引用分配的?
Are objects in PHP assigned by value or reference?
问:
在此代码中:
<?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
答:
11赞
Emil H
7/10/2009
#1
它们在 PHP 4 中按值传递,在 PHP 5 中按引用传递。为了在 PHP 4 中通过引用传递对象,您必须将它们显式标记为:
$obj = &new MyObj;
评论
1赞
lud
9/22/2018
所以在 PHP4 中,当你传递值时,它是一个隐式克隆?
31赞
tomzx
7/10/2009
#2
您可以参考 https://www.php.net/manual/en/language.oop5.references.php 以获取问题的实际答案。
PHP5 OOP 经常被提及的一个关键点是“默认情况下,对象是通过引用传递的”。这并不完全正确。
PHP 引用是一个别名,它允许两个不同的变量写入相同的值。从 PHP5 开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,允许对象访问器查找实际对象。当一个对象通过参数发送、返回或分配给另一个变量时,不同的变量不是别名:它们保存指向同一对象的标识符的副本。
44赞
Paige Ruten
7/10/2009
#3
为什么不运行该函数并找出答案?
$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 关键字。
评论
0赞
Ali
7/10/2009
这在 PHP 4 上会发生什么?
0赞
Ali
7/10/2009
php 4 可以配置为像 php 5 一样通过引用进行赋值吗?
1赞
Paige Ruten
7/10/2009
是的,您可以使用“=&”赋值运算符而不是“=”来执行此操作。阅读: ca2.php.net/manual/en/language.references.whatdo.php
1赞
hakre
6/23/2012
在 PHP 中,对象不是通过引用分配的,但它们是表示内存中对象(标识符)的值。即使该值被复制,它也很小,PHP 内部总是使用由标识符表示的对象。因此,对象本身不会被复制,只有它的标识符;)由于通常不鼓励使用引用(因为您需要非常了解语言才能使用它们),因此只需传递不带引用即可。
上一个:为什么该方法会更改传递的数组的值
下一个:将数组作为参数传递给方法
评论