最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP7內核之Reference詳解

 更新時間:2019年03月14日 08:45:31   作者:風雪之隅  
這篇文章主要介紹了PHP7內核之Reference,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

問題

上一章說過引用(REFERENCE)在PHP5的時候是一個標志位, 而在PHP7以后我們把它變成了一種新的類型:IS_REFERNCE. 然而引用是一種很常見的應用, 所以這個變化帶來了很多的變化, 也給我們在做PHP7開發(fā)的時候, 因為有的時候疏忽忘了處理這個類型, 而帶來不少的bug.

最簡單的情況, 就是在處理各種類型的時候, 從此以后我們要多考慮這種新的類型, 比如在PHP7中, 這樣的代碼形式就變得很常見了:

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該如何表示呢?

為此, 我們創(chuàng)造了這個新的類型:

 如圖所示, 引用是一種新的類型: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)的時候, 我們發(fā)現$val是一個計數大于1的引用, 所以要產生Change on write, 也就是分離. 所以我們需要復制這個zval.

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

再隨后的賦值給$copy(line 3)的時候, 發(fā)現$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

 可見確實沒有發(fā)生復制, 從而不會產生任何的性能問題.

以上所述是小編給大家介紹的PHP7內核之Reference詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

相關文章

  • php開啟安全模式后禁用的函數集合

    php開啟安全模式后禁用的函數集合

    前幾天看公司面試題的時候有看到這樣的題目,有一些函數還是能記得的,今天剛好查了一下手冊,在這里記錄下。
    2011-06-06
  • php中explode函數用法分析

    php中explode函數用法分析

    這篇文章主要介紹了php中explode函數用法,實例分析了explode函數分割字符串及獲取文件后綴名等應用,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-11-11
  • 自己在做項目過程中學到的PHP知識收集

    自己在做項目過程中學到的PHP知識收集

    以前沒學過PHP,最近剛好一個項目需要用到,我就決定一邊學一邊做PHP
    2012-08-08
  • PHP循環(huán)與分支知識點梳理

    PHP循環(huán)與分支知識點梳理

    涉及到一些比較復雜的邏輯,分支與循環(huán)是必不可少的。通過分支和循環(huán)的結合使用可以使業(yè)務更加復雜,代碼功能更加強大,這篇文章主要介紹了PHP循環(huán)與分支知識點
    2022-11-11
  • php 生成簽名及驗證簽名詳解

    php 生成簽名及驗證簽名詳解

    這篇文章主要介紹了php 生成簽名及驗證簽名詳解的相關資料,需要的朋友可以參考下
    2016-10-10
  • PHP按指定鍵值對二維數組進行排序的方法

    PHP按指定鍵值對二維數組進行排序的方法

    這篇文章主要介紹了PHP按指定鍵值對二維數組進行排序的方法,涉及PHP二維數組的遍歷及array_multisort函數的使用技巧,需要的朋友可以參考下
    2015-12-12
  • PHP中=>和->以及::符號的用法

    PHP中=>和->以及::符號的用法

    講完了php基礎運算符,下面再講一下,php新手經常碰到的問題,->、=> 和 :: 這三個家伙是什么分別都是做什么的啊!看著就很暈
    2021-09-09
  • 簡介PHP的Yii框架中緩存的一些高級用法

    簡介PHP的Yii框架中緩存的一些高級用法

    這篇文章主要介紹了PHP的Yii框架中緩存的一些高級用法,包括頁面緩存與會話緩存限制器等內容,需要的朋友可以參考下
    2016-03-03
  • PHP根據key刪除數組中指定的元素

    PHP根據key刪除數組中指定的元素

    今天小編就為大家分享一篇關于PHP根據key刪除數組中指定的元素,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • PHP開發(fā)中解決并發(fā)問題的幾種實現方法分析

    PHP開發(fā)中解決并發(fā)問題的幾種實現方法分析

    這篇文章主要介紹了PHP開發(fā)中解決并發(fā)問題的幾種實現方法,結合實例形式分析了php通過各種加鎖機制解決并發(fā)問題的相關操作技巧,需要的朋友可以參考下
    2017-11-11

最新評論

吉首市| 娱乐| 台南市| 大田县| 德钦县| 堆龙德庆县| 武隆县| 泸定县| 南充市| 尉氏县| 纳雍县| 清徐县| 安岳县| 新乡市| 霍林郭勒市| 射阳县| 都兰县| 安岳县| 台南市| 武乡县| 资阳市| 昌宁县| 高碑店市| 札达县| 新泰市| 宝坻区| 永仁县| 佛学| 兴文县| 峨山| 社旗县| 抚顺县| 隆德县| 绥江县| 丹凤县| 鄂托克前旗| 石首市| 麦盖提县| 桐乡市| 麻江县| 枣阳市|