在这段代码中:
<?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");
}
}
?>
Run Code Online (Sandbox Code Playgroud)
当该方法Bar::test()运行并且它改变了foo对象数组中foo#5的值时,数组中的实际foo#5是否会受到影响,或者该$testFoo变量只是一个最终不再存在的局部变量功能?
Jer*_*ten 27
为什么不运行该功能并找出?
$b = new Bar;
echo $b->getFoo(5)->value;
$b->test();
echo $b->getFoo(5)->value;
Run Code Online (Sandbox Code Playgroud)
对我来说,上面的代码(以及你的代码)产生了这个输出:
Foo #5
My value has now changed
Run Code Online (Sandbox Code Playgroud)
这不是由于"通过引用传递",而是由于"按引用分配".在PHP 5中,按引用分配是对象的默认行为.如果要按值分配,请使用clone关键字.
tom*_*mzx 21
您可以参考http://ca2.php.net/manual/en/language.oop5.references.php获取问题的实际答案.
经常提到的PHP5 OOP的关键点之一是"对象默认通过引用传递".这不完全正确.
PHP引用是一个别名,它允许两个不同的变量写入相同的值.从PHP5开始,对象变量不再包含对象本身作为值.它只包含一个对象标识符,允许对象访问者查找实际对象.当一个对象通过参数发送,返回或分配给另一个变量时,不同的变量不是别名:它们包含标识符的副本,该副本指向同一个对象.
它们通过PHP 4中的值传递,并通过PHP 5中的引用传递.为了在PHP 4中通过引用传递对象,您必须明确地将它们标记为:
$obj = &new MyObj;
Run Code Online (Sandbox Code Playgroud)