PHP 5传递类Object作为参数,它总是一个指针或副本或克隆?

时间:2013-12-29 21:22:42

标签: php scope

我有一个关于将对象作为参数传递的问题。当我们传递一个变量时,它会创建一个副本,但看起来像对象总是一个引用指针,这是正确的吗?我已使用以下示例代码进行测试:

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类的变量会影响所有这些变量,这是否意味着它总是指向同一个对象作为指针?

谢谢。

1 个答案:

答案 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;)通过引用传递参数,但是对于对象,它通常是无用的。