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


Does Passing by Reference Avoid Creating New Variable?

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

<?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时,它是在内存中创建了一个新的变量,使计数达到两个,还是只是传递了引用仍然只留下一个对象?

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

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

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

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

对象

引用和值的一般概念通常知之甚少。 对象变量包含对象的句柄,因此如果$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。 这造成了副作用,故意或(更常见的(偶然。 通过函数参数执行此操作是相同的。

道德:不要对对象使用引用,除非你真的明白你在做什么,为什么,以及陷阱是什么。

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

对象始终通过引用传递。如果您显式使用 & 符号,通常只有简单的变量通过引用传递。所以$myObj是一个"指针">