通过引用传递是否避免创建新变量?

时间:2012-02-02 22:15:01

标签: php oop

如果我通过引用将变量或对象传递给函数调用,我会想象它避免在内存中创建第二个对象,从而保留资源?例如:

<?php

class CoolObject
{
    // Have some properties here

    public function __construct()
    {
       // Do some stuff
    }

    public function test()
    {
       echo("Test");
    }
}

function doSomething(&$param)
{
   // Calls original instance, still only one object in memory
   $param->test();

   // Does this create a second instance in memory, or just assign
   // the reference?
   $newObj = $param;
}

// Create 1st instance of object in memory
$myObj = new CoolObject;

// Do a test to determine number of instances created
doSomething($myObj);

?>

当我将“by reference”变量分配给$ newObj时,它是否在内存中创建了一个新的计数器,将计数最多为2,或者只是通过引用仍然只留下一个对象?

4 个答案:

答案 0 :(得分:3)

如果通过引用传入变量,那么它是正确的,因为它不会复制对象。相反,它将指针复制到对象。因此,虽然它使用了一些内存,但只有内存量等于指针的大小。

当您创建指向同一对象的另一个变量时,您再次复制指针,其结果与上述相同。

就引用计数和对象而言,每次复制指针时,引用计数器都会递增。

仅当引用计数为零时才会释放对象。

答案 1 :(得分:2)

对象的引用和值的一般概念通常知之甚少。对象变量包含对象的句柄,因此如果$x是某个对象,我们将其分配给其他几个变量,比如说

$x  = new Jim;
$d  = $x;
$e &= $x;

2dn和3rd语句是便宜的分配,因为所有这些都是分配一个对象句柄。例如,这与$y=5的成本顺序相同。

$d->someproperty$d->somemethod()$x->someproperty$x->somemethod()相同。同上$e。当您对$d$e执行新作业时会出现差异:

$d  = new Fred;
$e = $someotherobject;

$d现在引用与$x不同的对象,但$x不变。 $e作业$e仍然引用与$x相同的对象,但现在都将引用到Fred。这造成了副作用,故意或(更常见)意外。通过函数参数执行此操作是一样的。

道德:除非你真正了解你在做什么,为什么以及陷阱是什么,否则不要对对象使用引用。

答案 2 :(得分:1)

我的理解是,如果您通过引用传递,则不会创建新变量,但对您在该函数中使用的变量所做的更改也会影响您传入的原始变量。

答案 3 :(得分:0)

对象始终通过引用传递。如果您明确使用&符号,通常只会通过引用传递简单变量。所以$myObj是一个“指针”