中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP7中Reference有什么用

發布時間:2021-06-09 16:48:20 來源:億速云 閱讀:134 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關PHP7中Reference有什么用,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

try_again:
swtich (Z_TYPE_P(zv)) {
   case IS_TRING:
   break;
   case IS_ARRAY:
   break;
  ...
   case IS_REFERENCE:
   zv = Z_REFVAL_P(zv); //解引用
   goto try_again;
   break;
}

如果大家自己寫的擴展, 如果忘了考慮這種新的類型, 那么就會導致問題.

為什么?
那么既然這種新類型會帶來這么多問題, 那么當時為什么要用把引用變成一種類型呢? 為什么不還是使用一個標志位呢?

一句話來說, 就是我們不得不這么做. -_#

前面說到, Hashtable直接存儲的是zval, 這樣在符號表中, 倆個zval如何共用一個數值呢? 對于字符串等復雜類型來說還好, 我們貌似可以在zend_refcounted結構中加入一個標志位來表明是引用來解決, 然而這個也會遇到Change On Write帶來的復制, 但是我們知道在PHP7中, 一些類型是直接存儲在zval中的, 比如IS_LONG, 但是引用類型是需要引用計數的, 那么對于一個是IS_LONG并且又是IS_REFERNCE的zval該如何表示呢?

為此, 我們創造了這個新的類型:

PHP7中Reference有什么用

 如圖所示, 引用是一種新的類型:zend_reference, 對于IS_REFERNCE類型的zval, zval.value.ref是一個指向zend_reference的指針, 它包含了引用計數和一個zval, 具體的zval的值是存在zval.value.ref->val中的.

所以對于IS_LONG的引用來說, 就用一個類型是IS_REFERNCE的zval, 它指向一個zend_reference, 而這個zend_reference->val中是一個類型為IS_LONG的zval.

Change On Write
PHP采用引用計數來做簡單的垃圾回收, 考慮如下的代碼:

<?php
1. $val = "laruence";
2. $ref = &$val;
3. $copy = $val;
?>

$ref和$val是指向同一個zval的引用, 在PHP5的時候, 我們是通過一個引用計數為2, 并且引用標志位為1來表示這種情況, 當把$val復制給$copy(line 3)的時候, 我們發現$val是一個計數大于1的引用, 所以要產生Change on write, 也就是分離. 所以我們需要復制這個zval.

而在PHP7中, 情況就變得簡單了很多, 首先在引用賦值給$ref(line 2)的時候, 生成一個IS_REFERNCE類型, 然后因為此時有倆個變量引用它所以zend_reference這個結構的引用計數zval.value.ref->gc.refcount為2.

再隨后的賦值給$copy(line 3)的時候, 發現$val是一個引用, 于是讓$copy指向的是zval.value.ref->val, 也就是字符串值為laruence的zval, 然后把zval的引用計數+1, 也就是zval.value.ref->val.value.str.gc.refcount為2. 并沒有產生復制.

從而這就很好的解決了上一章所說的PHP5的那個經典的問題, 比如我們在PHP7下運行上一章的那個問題, 我們得到的結果是:

$ php-7.0/sapi/cli/php /tmp/1.php
Used 0.00021380008539
Used 0.00020173048281

上述就是小編為大家分享的PHP7中Reference有什么用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巫山县| 临颍县| 石楼县| 肥西县| 林口县| 乐安县| 江达县| 来安县| 务川| 福鼎市| 东乡族自治县| 枞阳县| 佛山市| 甘谷县| 宣化县| 上虞市| 海阳市| 安化县| 资中县| 蓬溪县| 荆门市| 怀远县| 双辽市| 大同市| 南投县| 荔浦县| 当涂县| 中卫市| 菏泽市| 玉屏| 淮阳县| 宜黄县| 怀来县| 古蔺县| 大庆市| 海南省| 三都| 扬中市| 平果县| 昭苏县| 当涂县|