2012-02-02 14 views
5

Jeśli przekazuję zmienną lub obiekt do wywołania funkcji przez odniesienie, wyobrażam sobie, że unika on tworzenia drugiego obiektu w pamięci, zachowując w ten sposób zasoby? Na przykład:Czy przechodzenie przez odniesienie Unikaj tworzenia nowej zmiennej?

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

?> 

Kiedy przypisana zmiennej „przez odniesienie” do $ newObj, to się utworzyć nową pamięć przynosząc liczyć do dwóch, czy też po prostu przekazać odwołanie pozostawiając tylko jeden obiekt ?

Odpowiedz

3

Jeśli przekazujesz zmienną przez odniesienie, masz rację, nie powielając obiektu. Zamiast tego kopiuje wskaźnik do obiektu. Tak więc, chociaż wykorzystuje trochę pamięci, jest to tylko ilość pamięci równa wielkości wskaźnika.

Podczas tworzenia innej zmiennej, która wskazuje na ten sam przedmiot, znów jesteś kopiowania wskaźnik, z takimi samymi konsekwencjami, jak powyżej.

miarę liczenia i obiektów odniesienia, za każdym razem skopiować wskaźnik licznik referencyjna zostanie zwiększona.

Tylko wtedy, gdy licznik odniesień wynosi zero, obiekt zostaje zwolniony.

1

moim rozumieniu jest to, że jeśli przejdą przez odniesienie, nie utworzyć nową zmienną, ale zmiany wprowadzone do zmiennej używanej w tej funkcji będzie również wpływać na oryginalną zmienną, które przeszły w.

+0

Ok, rozumiem to. A co z drugą częścią ... jest $ newObj nową instancją lub "wskaźnikiem" do $ myObj? –

0

Przedmioty są zawsze przekazywane przez odniesienie. Tylko proste vary są zwykle przekazywane przez odniesienie, jeśli wyraźnie używasz znaku &. więc jest "wskaźnikiem"

+0

To pierwsze zdanie było tym, czego potrzebowałem podczas wyszukiwania w Google.Oto, czego się nauczyłem http://php.net/manual/en/language.oop5.references.php –

2

Ogólna koncepcja odniesień i wartości obiektu jest ogólnie słabo rozumiana. Zmienna obiektu zawiera uchwyt do obiektu, więc jeśli $x jakiś obiekt i przypisujemy go do kilku innych zmiennych, powiedzmy

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

2DN i 3rd wypowiedzi są tanie zadania jak to wszystko zrobić, to przypisać uchwyt obiektu. Jest to na przykład ta sama kolejność kosztów, co $y=5.

$d->someproperty i $d->somemethod() odnoszą się do tego samego, jak i jako $x->someproperty$x->somemethod(). Ditto dla $e. Różnica występuje po wykonaniu nowych zadań do $d i $e:

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

$d odnosi się teraz do innego obiektu z $x, ale $x jest inaczej niezmienione. Z ustalonym $e$e nadal odnosi się do tego samego obiektu jako $x ale odnoszą się zarówno doFred. Stworzyło to efekt uboczny, celowy lub (częściej) przypadkowy. Robi się to za pośrednictwem argumentów funkcji jest takie samo.

Moral: Nie używaj referencji z obiektami, chyba że naprawdę zrozumieć, co robisz, i dlaczego, i jakie są pułapki.

Powiązane problemy