我有一个关于将对象作为参数传递的问题。当我们传递一个变量时,它会创建一个副本,但看起来像对象总是一个引用指针,这是正确的吗?我已使用以下示例代码进行测试:
class Base
{
private $var;
function set ($var)
{
$this->var = $var;
}
function show ()
{
echo $this->var, '<br>';
}
}
class Car
{
private $obj;
function __construct($obj)
{
$this->obj = $obj;
}
function set ($var)
{
$this->obj->set($var);
}
function show()
{
$this->obj->show();
}
}
class Bus
{
private $obj;
function __construct($obj)
{
$this->obj = $obj;
}
function set ($var)
{
$this->obj->set($var);
}
function show()
{
$this->obj->show();
}
}
通过运行
$base = new Base();
$base->set('one');
$base->show(); // one
$bus = new Bus($base);
$bus->show(); // one
$car = new Car($base);
$car->set('two');
$car->show(); // two
$base->show(); // two
$bus->show(); // two
显示结果为:
one
one
two
two
two
因此,即使将参数作为参数传递给函数或其他类,也会更改Base类的变量会影响所有这些变量,这是否意味着它总是指向同一个对象作为指针?
谢谢。
答案 0 :(得分:7)
在PHP中当您将object作为参数传递时,它是引用的副本。所以:
$ob = new StdClass;
$ob->var = "Lorem";
function aa($o) {
$o->var="Ipsum";
}
echo $ob->var;
这将输出Ipsum
,但如果您将其他对象分配给该$ o引用:
function aa($o) {
$o = new StdClass;
$o->var="Ipsum";
}
它将输出Lorem
- 因为$ ob仍指向先前创建的对象。
顺便说一下:
如果将函数定义更改为function aa(&$o)
。现在它将再次输出Ipsum
,因为$ o引用$ ob引用:)
总结一下:
在PHP中,默认情况下,参数按值传递 - 如果它们是对象! 但是!在代码$ob = new StdClass;
中,$ob
是对象的引用。因此,默认情况下,我们将传递引用的副本。他们将指向相同的对象。但是,如果更改传递的变量($o = new StdClass;
),$ob
仍然指向同一个对象。这就是为什么在修改后给出的示例将输出Lorem
。
您可以使用&符号(&amp;)通过引用传递参数,但是对于对象,它通常是无用的。