PHP引用變數知識詳解

來源:互聯網
上載者:User
這篇文章主要介紹了關於PHP引用變數知識詳解,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

  • 概念:在PHP中引用意味著用不同的名字訪問同一個變數內容;

  • 定義方式:PHP使用 ‘&’定義引用變數;

  • 當不使用引用時,變數採取寫時複製機制機制(COW):在寫入時會複製一份記憶體進行修改,例如

//定義一個變數$a = range(0,1000);var_dump(memory_get_usage()); //列印記憶體使用量量//定義一個變數b$b = $a; //此時$b和$a 指向同一個記憶體空間var_dump(memory_get_usage());//當a或b發生寫入時,才會複製一塊記憶體進行修改$a = range(0,1000);var_dump(memory_get_usage());

運行結果:第一次和第二次列印時記憶體使用量量相差不多,第三次發生明顯變化,說明當a進行寫入操作時,記憶體發生了複製。


  • 而當時用引用時變數將指向同一記憶體空間,寫入操作時不會發生改變

//定義一個變數$a = range(0,1000);var_dump(memory_get_usage()); //列印記憶體使用量量//定義一個變數b$b = &$a; //將a的空間賦值給b,a與b指向同一空間var_dump(memory_get_usage());//當a或b發生寫入時,記憶體不會發生複製$a = range(0,1000);var_dump(memory_get_usage());

運行結果:記憶體始終未發生明顯變化

通過zval變數容器進行驗證

//通過zval變數容器列印$a = range(0,3);xdebug_debug_zval('a');//列印 指向記憶體空間的變數數,和是否被引用$c =&$a;xdebug_debug_zval('a');$c = range(0,3);xdebug_debug_zval('a');

運行結果:

當對c進行寫入操作時仍有2個變數指向記憶體,未發生寫時複製



  • unset只會取值 (Dereference),不會銷毀空間

  • 在php中對象本身就是引用傳值,不需使用引用符號

class Person{    public $name  = "zhangsan";}$p1 = new Person();xdebug_debug_zval('p1');$p2 = $p1;xdebug_debug_zval('p1');$p2->name = "lesi";xdebug_debug_zval('p1');


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.