欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP7內(nèi)核之Reference詳解

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

問題

上一章說過引用(REFERENCE)在PHP5的時候是一個標(biāo)志位, 而在PHP7以后我們把它變成了一種新的類型:IS_REFERNCE. 然而引用是一種很常見的應(yīng)用, 所以這個變化帶來了很多的變化, 也給我們在做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;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • 編寫PHP腳本來實現(xiàn)WordPress中評論分頁的功能

    編寫PHP腳本來實現(xiàn)WordPress中評論分頁的功能

    這篇文章主要介紹了編寫PHP腳本來實現(xiàn)WordPress中評論分頁的功能的方法,包括上一頁下一頁和導(dǎo)航式分頁功能的添加,需要的朋友可以參考下
    2015-12-12
  • php導(dǎo)出中文內(nèi)容excel文件類實例

    php導(dǎo)出中文內(nèi)容excel文件類實例

    這篇文章主要介紹了php導(dǎo)出中文內(nèi)容excel文件類,實例分析了php操作帶有中文內(nèi)容的Excel文件及文件導(dǎo)出的實現(xiàn)方法,需要的朋友可以參考下
    2015-07-07
  • PHP實現(xiàn)通過CURL上傳文件功能示例

    PHP實現(xiàn)通過CURL上傳文件功能示例

    這篇文章主要介紹了PHP實現(xiàn)通過CURL上傳文件功能,結(jié)合實例形式分析了php使用curl文件上傳操作相關(guān)屬性設(shè)置與使用技巧,需要的朋友可以參考下
    2018-05-05
  • PHP之將POST數(shù)據(jù)轉(zhuǎn)化為字符串的實現(xiàn)代碼

    PHP之將POST數(shù)據(jù)轉(zhuǎn)化為字符串的實現(xiàn)代碼

    今天來分享一個方便我們做LOG日志記錄的自定義函數(shù),需要將POST數(shù)據(jù)轉(zhuǎn)化為字符串,需要的朋友可以參考下
    2016-11-11
  • PHP對象、模式與實踐之高級特性分析

    PHP對象、模式與實踐之高級特性分析

    這篇文章主要介紹了PHP對象、模式與實踐之高級特性,結(jié)合實例形式分析了php面向?qū)ο蟪绦蛟O(shè)計中的靜態(tài)屬性和方法、抽象類、接口、攔截器、克隆對象等概念與簡單實現(xiàn)方法,需要的朋友可以參考下
    2016-12-12
  • PHP使用OCR技術(shù)識別圖片中的文字(無需接口)

    PHP使用OCR技術(shù)識別圖片中的文字(無需接口)

    tesseract-ocr是一個流行的開源OCR引擎庫,它使用C++編寫,?PHP作為一種流行的服務(wù)器端語言,也提供了一些ocr識別的庫和工具,可以通過tesseract-ocr識別PDF、JPEG、GIF、PNG等格式的圖像,?tesseract-ocr的最大特點是它是針對多語言設(shè)計的,可以識別世界上大部分語言的文本
    2024-04-04
  • php中目錄操作opendir()、readdir()及scandir()用法示例

    php中目錄操作opendir()、readdir()及scandir()用法示例

    這篇文章主要介紹了php中目錄操作opendir()、readdir()及scandir()用法,結(jié)合具體實例形式分析了PHP使用opendir()、readdir()及scandir()讀取目錄的相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06
  • PHP樹形結(jié)構(gòu)tree類用法示例

    PHP樹形結(jié)構(gòu)tree類用法示例

    這篇文章主要介紹了PHP樹形結(jié)構(gòu)tree類用法,結(jié)合實例形式分析了php無限分類樹tree.class.php的定義及使用相關(guān)操作技巧,需要的朋友可以參考下
    2019-02-02
  • php一行代碼獲取文件后綴名實例分析

    php一行代碼獲取文件后綴名實例分析

    這篇文章主要介紹了php一行代碼獲取文件后綴名的方法,以實例形式較為詳細的分析了其中涉及的函數(shù)和原理,并補充了三種常用的獲取文件后綴名的方法,需要的朋友可以參考下
    2014-11-11
  • jquery獲取多個checkbox的值異步提交給php的方法

    jquery獲取多個checkbox的值異步提交給php的方法

    這篇文章主要介紹了jquery獲取多個checkbox的值異步提交給php的方法,涉及jQuery操作頁面元素進行異步傳輸?shù)南嚓P(guān)技巧,需要的朋友可以參考下
    2015-06-06

最新評論