2016-01-13 23 views
6
<?php 

$s = "foobar"; 

$t = $s; 

$u = $s; 

echo PHP_VERSION . "\n"; 

debug_zval_dump($s); 

xdebug_debug_zval('s'); 

運行5.6.16混淆PHP 7引用次數

php 5 refcount

運行7.0.2

php 7 refcount

我想結果(PHP 7)應是:

string(6) "foobar" refcount(4) 
s: (refcount=3, is_ref=0)="foobar" 

我想知道是什麼造成了差異?需要一些解釋。非常感謝。

------更新------

Nikita Popov's - PHP 7 - 內部有什麼變化? (P41)

http://www.slideshare.net/nikita_ppv/php-7-what-changed-internally

slideshare

+0

http://php.net/manual/en/features.gc.refcounting-basics.php – devpro

+0

@devpro這是php 5.x – Lynn

+0

兩個都沒有改變..概念 – devpro

回答

8

在PHP 7的zval可以參考計數或沒有。 zval結構中有一個標誌確定了這一點。

有一些類型,從來沒有被引用。這些類型爲null,bool,int和double。

還有其他類型,總是refcounted。這些是對象,資源和參考。

然後有類型,它們是有時 refcounted。那些是字符串和數組。

對於字符串,未引用的變體稱爲「interned字符串」。如果您使用的是NTS(不是線程安全的)PHP 7版本,您通常會使用代碼中的所有字符串文字。這些被插入的字符串被重複數據刪除(即只有一個帶有特定內容的被插入的字符串)並且保證在請求的整個持續時間內存在,所以不需要爲它們使用引用計數。如果使用opcache,這些字符串將存在於共享內存中,在這種情況下,您不能使用對它們使用引用計數(因爲我們的refcounting機制是非原子的)。 Interned字符串的虛擬引用數爲1,這是你在這裏看到的。

對於數組而言,未引用的變體稱爲「不可變數組」。如果使用opcache,那麼代碼中的常量數組文字將被轉換爲不可變數組。再次,這些生活在共享內存,因此不得使用refcounting。不可變數組的虛擬引用數爲2,因爲它允許我們優化某些分離路徑。

+0

謝謝!得到它了! :) – Lynn