<?php $a = 1; xdebug_debug_zval('a'); $b = $a; xdebug_debug_zval('a'); $a = 2; xdebug_debug_zval('a'); xdebug_debug_zval('b');
結果以下:php
a: (refcount=1, is_ref=0)=1 a: (refcount=2, is_ref=0)=1 b: (refcount=1, is_ref=0)=2 a: (refcount=1, is_ref=0)=1
過程分析: bash
1,$a 建立了 引用計數(指向數)爲1,非地址引用 而且 值爲int類型 1 的 zval容器;
2,新建一個$b,因爲是經過賦值的方式將 $a 賦值給 變量$b 的,兩個變量所保存的值徹底同樣,所以不會申請新內存來存放新變量所保存的值,而是簡單的經過一個計數器來共用內存。因此,此時$b也指向 $a 的zval 容器,能夠看到引用計數變爲了2,仍然是非地址引用;
3,將$a的值賦值爲 2,值發生了該表,因爲該zval 容器非地址引用,因此係統會從新建立一個 引用計數(指向數)爲1,非地址引用而且值爲int類型2 的新的zval 容器 指向$a ,因爲 $a 再也不指向原zval容器,因此原容器的 引用計數(指向數) 減 1。spa
總結: 當經過值傳遞方式進行賦值時,因爲兩個變量保存的值徹底同樣,爲了 複用內存,PHP不會爲新變量申請新的內存來存放值,而只是在原 zval 容器中將引用計數+1。只有當兩個變量中的任何一個變量的值發生改變時,PHP纔會從新爲發生 值改變 的那個變量申請一個新內存,建立一個新的zval容器。debug
以上內容 就是php內核的一個重要的特性:引用計數 與 寫時複製 原理。code