2012-02-02 79 views
5

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

<?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); 

?> 

当我分配了“参照”变量$ newObj,并在内存中创建一个新的使数最多两个,还是它只是通过仍然只留下一个对象的引用?

回答

3

如果您在通过参考变量传递,你在它不复制对象正确。相反,它将指针复制到对象。所以,虽然它使用了一些内存,但它只是与指针大小相等的内存量。

当你创建一个指向同一个对象,同样,你要复制的指针,与上述相同的后果另一个变量。

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

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

1

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

+0

好的,我明白了。那么第二部分呢......是$ newObj一个新实例还是$ myObj的“指针”? – 2012-02-02 22:21:06

0

对象总是通过引用传递。如果您明确使用&符号,则只有简单的变量才能通过引用传递。所以$myObj是一个“指针”

+0

第一句话是我需要Google搜索的。这是我学到的http://php.net/manual/en/language.oop5.references.php – 2012-02-02 23:02:48

2

对象的引用和值的一般概念通常很难理解。一个对象变量包含的句柄的对象,因此,如果$x是一些对象,我们将其分配给其他几个变量,说

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

的2DN和第三陈述便宜的任务,因为所有这些要做的就是分配一个对象句柄。例如,这与$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。这造成了副作用,故意或(通常)意外。通过函数参数来做到这一点是一样的。

道德:不要使用对象的引用,除非你真的了解你在做什么,为什么,什么缺陷是。

相关问题