2013-01-24 63 views
2

我很困惑如何使用&運營商減少記憶。=&運營商,記憶

我可以有以下問題的答案嗎?

clase C{ 

    function B(&$a){ 
     $this->a = &$a; 

     $this->a = $a; 

     //They are the same here created new variable $this->a?? 
     // Or only $this->a = $a will create new variable? 
    } 
} 

$a = 1; 

C = new C; 
C->B($a) 

或者,也許我的理解是完全錯誤的.....

+1

http://php.net/manual/en/language醜陋的副作用。 references.pass.php – user1909426

+1

猜你根本不需要'&'。 – KingCrunch

回答

12

永遠不要在PHP中使用引用只是爲了減少內存負載。 PHP通過編寫機制完美處理其內部副本。例如:

$a = str_repeat('x', 100000000); // Memory used ~ 100 MB 
$b = $a;       // Memory used ~ 100 MB 
$b = $b . 'x';     // Memory used ~ 200 MB 

如果你知道自己在做什麼,需要他們功能(而這幾乎從來沒有,所以你可以也只是他們忘了),才應使用引用。 PHP引用很古怪,可能會導致一些意外的行爲。

+0

非常感謝你!!!!! – Till

3

值類型變量纔會被複制時,他們的價值變化,如果你只在你的榜樣分配給它,它不會被複制,內存佔用將與您未使用&運算符相同。

我建議你閱讀這些文章引用傳遞值:

When to pass-by-reference in PHP

When is it good to use pass by reference in PHP?

http://schlueters.de/blog/archives/125-Do-not-use-PHP-references.html

它被認爲是一個microoptimalization,傷害了代碼

的透明度
+0

非常感謝! – Till

3

我很困惑如何使用&算子來減少記憶。

如果你不知道的話,你可能不需要它了:) &沒什麼用處,如今,因爲在PHP核心在過去幾年幾項增強。通常你會使用&來避免PHP將該值複製到爲第二個變量分配的內存中,但是(簡而言之)讓兩個變量指向相同的內存。

但現在

  • 對象作爲參考反正過去了。他們不克隆自理神奇,因爲它們傳遞給方法;)
  • 當你通過原始類型,PHP將複製的價值,除非修改變量(寫入時複製)。

概括起來:的&好處已經存在爲核心的功能,但沒有操作

+0

非常感謝,所以使用&否最終會使用相同數量的記憶?我明白了嗎?對不起...... – Till

+1

'&'在用於其預定用途時幾乎沒有用處。我只是在昨天將'$ itemTree [$ a] [$ b] [$ id]'別名到'$ items [$ id]'來簡化地獄項目的循環。 :)但第一句話是重要的一句;如果你不知道你在做什麼,你幾乎肯定不應該僅僅爲了節省內存或其他東西而使用它。 – cHao

+0

@Till不成熟的優化是萬惡之源;)你真的有這麼大的內存使用,你必須照顧它,它不能通過(例如)塊/分頁解決嗎? '&'是一個引用,意思是:如果你改變其中一個變量的值,另一個也會被改變(因爲它們都指向相同的'zval'(「memory」)。你只會很難追蹤錯誤你幾乎贏不了任何東西 – KingCrunch