日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php引用计数器,PHP 引用计数器 通俗版解释_PHP教程

發布時間:2025/3/12 php 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php引用计数器,PHP 引用计数器 通俗版解释_PHP教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PHP 引用計數器 通俗版解釋

概述

最近看PHP中的引用計數器部分,首先被各種繞暈,然后通過看博客和分析后,總結了一個比較通俗的解釋,能幫助自己很好地記憶,也希望能幫助到各位讀者。這里分享一遍博文,是比較正統的解釋:PHP變量之引用(http://hilojack.sinaapp.com/?p=1392)。

建議

研究PHP引用計數器的變化可以通過安裝Xdebug擴展來學習,安裝后直接調用 xdebug_debug_zval('var') 來看變量 $var的引用計數器情況。

基礎知識

談引用計數器需要對PHP中變量的存儲、引用計數的機制有所了解,引用計數當然是節約內存,在不影響語義正確性的前提下,讓多個變量符號共享一個內存值空間(又稱為變量容器)。引用計數什么時候發生變化:賦值。 賦值又有兩種: 值傳遞賦值和引用賦值。比較難以理解的是引用賦值。引用計數的另一個作用就是指示什么時候可以共用同一空間,什么時候必須進行變量分離(另開辟空間)。

通俗解釋

為了便于理解和記憶,本人對賦值中的各種情景給以通俗的解釋,不要與現實情況對號入座,

& 號是結合,可以相當于結婚,但是PHP中允許多個人一起結婚(即一夫多妻制或一妻多夫制),這個比較變態。 注意結婚必須同居,分居是不行的。除了結婚外還有一種形態叫 合租。合租也是同居,但是沒有任何關系,允許多人合租,這個是合情合理的。當然還有一種情況是獨居,這個比較容易理解。以下面的例子說明賦值語句與這三種狀態對應關系:

情景一:

$a = "a"; // $a 獨居, is_ref = 0, refcount = 1;

$b = $a; // $a 與 $b 合租, is_ref = 0, refcount = 2;情景二:

$a = "a"; // $a 獨居, is_ref = 0, refcount = 1;

$b = &$a; // $a 與 $b 結婚, is_ref = 1, refcount = 2;上面可以看出, is_ref可以理解為結婚證,=1 表示兩個和多個變量是結婚關系, =0沒有結婚(可以合租或同居),refcount表示了多少個變量住在一起了,=1表示獨居,>1表示多人同居(記住,結婚必須同居,但同居未必是結婚關系)。

下面開始分析賦值時的變量變化關系:

情景一:

$a = "a"; ?// $a 獨居, is_ref = 0, refcount = 1;

$b = $a; ? // $a 與 $b 合租, is_ref = 0, refcount = 2;

$va = "b"; // $va 獨居, is_ref = 0, refcount = 1;

$vb = $va; // $va 和 $vb 合租, is_ref = 0, refcount = 2;

$a = $va; ?// $a是單身,$va也是單身,因此 $a 搬去與 $va 同居,現在$a,$va,$vb三人同居

賦值后:

$a: is_ref = 0, refcount = 3, string = "xyz"

$b: is_ref = 0, refcount = 1, string = "qwe"

$va: is_ref = 0, refcount = 3, string "xyz"

$vb: is_ref = 0, refcount = 3, string "xyz"

情景二:

$a = "a"; ?// $a 獨居, is_ref = 0, refcount = 1;

$b = &$a; ? // $a 與 $b 結婚, is_ref = 1, refcount = 2;

$va = "b"; // $va 獨居, is_ref = 0, refcount = 1;

$vb = $va; // $va 和 $vb 合租, is_ref = 0, refcount = 2;

$a = $va; ?// $a是已婚, $a 不能隨便單獨搬出去,賦值會使$va的值拷貝給$a,其他關系不變

$a: is_ref = 1, refcount = 2, string = "xyz"

$b: is_ref = 1, refcount = 2, string = "xyz"

$va: is_ref = 0, refcount = 2, string "xyz"

$vb: is_ref = 0, refcount = 2, string "xyz"

情景三:

$a = "a"; ?// $a 獨居, is_ref = 0, refcount = 1;

$b = &$a; ? // $a 與 $b 結婚, is_ref = 1, refcount = 2;

$va = "b"; // $va 獨居, is_ref = 0, refcount = 1;

$vb = &$va; // $va 和 $vb 結婚, is_ref = 1, refcount = 2;

$a = $va; ?// $a是已婚, 與情景二相同,值拷貝,關系不變

賦值后:

$a: is_ref = 1, refcount = 2, string = "xyz"

$b: is_ref = 1, refcount = 2, string = "xyz"

$va: is_ref = 1, refcount = 2, string "xyz"

$vb: is_ref = 1, refcount = 2, string "xyz"

情景四:

$a = "qwe"; // $a 獨居, is_ref = 0, refcount = 1;

$b = $a; // $a 與 $b 同居, is_ref = 0, refcount = 2;

$va = "xyz"; // $va 獨居, is_ref = 0, refcount = 1;

$vb = &$va; // $va 和 $vb 結婚, is_ref = 1, refcount = 2;

$a = $va; // $a 想與 $va同居(而非結婚),但是$va已婚的,因此 $a只能從$b那里搬出來,重新分配個房子,值與$va一樣(術語叫:變量分離);$va和$vb關系不變

賦值后:

$a: is_ref = 0, refcount = 1, string = "xyz"

$b: is_ref = 0, refcount = 1, string = "qwe"

$va: is_ref = 1, refcount = 2, string "xyz"

$vb: is_ref = 1, refcount = 2, string "xyz"

情景五:

$a = "qwe"; // $a 獨居, is_ref = 0, refcount = 1;

$b = $a; // $a 與 $b 同居, is_ref = 0, refcount = 2;

$va = "xyz"; // $va 獨居, is_ref = 0, refcount = 1;

$vb = $va; // $va 和 $vb 同居, is_ref = 0, refcount = 2;

$a = &$va; // $a 想與 $va結婚,現在$a 和 $va 都是單身但是都有室友了,因此他們各自從原來的地方搬出來,然后分個新房子,值與$va原來的一樣

賦值后:

$a: is_ref = 1, refcount = 2, string = "xyz"

$b: is_ref = 0, refcount = 1, string = "qwe"

$va: is_ref = 1, refcount = 2, string "xyz"

$vb: is_ref = 0, refcount = 1, string "xyz"

情景六:

$a = "qwe"; // $a 獨居, is_ref = 0, refcount = 1;

$b = $a; // $a 與 $b 同居, is_ref = 0, refcount = 2;

$va = "xyz"; // $va 獨居, is_ref = 0, refcount = 1;

$vb = &$va; // $va 和 $vb 結婚, is_ref = 1, refcount = 2;

$a = &$va; // $a 想與 $va 結婚,但是 $va 是已婚的,而 $a 是單身,因此 $a 搬過去和 $va 住,$va 現在有兩個配偶:$vb 和 $a

賦值后:

$a: is_ref = 1, refcount = 3, string = "xyz"

$b: is_ref = 0, refcount = 1, string = "qwe"

$va: is_ref = 1, refcount = 3, string "xyz"

$vb: is_ref = 1, refcount = 3, string "xyz"

情景七:

$a = "qwe"; // $a 獨居, is_ref = 0, refcount = 1;

$b = &$a; // $a 與 $b 結婚, is_ref = 1, refcount = 2;

$va = "xyz"; // $va 獨居, is_ref = 0, refcount = 1;

$vb = $va; // $va 和 $vb 同居, is_ref = 0, refcount = 2;

$a = &$va; // $a 想與 $va 結婚,但是 $a 是已婚的,$va 是單身, 解決辦法是 $a 離婚后和 $va 結婚,同時 $va 從與 $vb合租的地方搬出來

賦值后:

$a: is_ref = 1, refcount = 2, string = "xyz"

$b: is_ref = 0, refcount = 1, string = "qwe"

$va: is_ref = 1, refcount = 2, string "xyz"

$vb: is_ref = 0, refcount = 1, string "xyz"

情景八:

$a = "qwe"; // $a 獨居, is_ref = 0, refcount = 1;

$b = &$a; // $a 與 $b 結婚, is_ref = 1, refcount = 2;

$va = "xyz"; // $va 獨居, is_ref = 0, refcount = 1;

$vb = &$va; // $va 和 $vb 結婚, is_ref = 1, refcount = 2;

$a = &$va; // $a 想與 $va 結婚,但是 $a和$va都是已婚的,誰離婚?$a!,因為是$a主動想和$va結婚,

// $a 離婚后$va住一起,$va 現在有兩個配偶:$vb 和 $a

賦值后:

$a: is_ref = 1, refcount = 3, string = "xyz"

$b: is_ref = 0, refcount = 1, string = "qwe"

$va: is_ref = 1, refcount = 3, string "xyz"

$vb: is_ref = 1, refcount = 3, string "xyz"

以上分析了簡單變量賦值的各種情形,不包括自引用的情況。概況來講:

簡單賦值 就是同居,需考察等號左側變量的is_ref(即是否已婚),若 is_ref = 1,則值拷貝,否則考慮左側便令,能否在不另外分配內存的情形下,與右側變量共用同一存儲空間(同居),此時要考察右側是否是已婚,若是,則不能同居,變量分離,若右側變量也是單身,則直接共用同一內存,所有同居者都遵循 COW(寫時拷貝)的原則。

引用賦值 就是結合, 需先考察右側變量的引用情況, 若 is_ref = 1,則直接 refcount ++, 出現多人結合的情況, 若右側是非引用的(is_ref = 0),那還需考察右側是否是獨居,若是獨居,則 左右兩個變量共用右側變量空間,否則右側變量從原來的地方分離出來和左側開辟新空間。 只要是引用賦值,那么左側變量總是要與之前結合的或共用的變量進行分離。

http://www.bkjia.com/PHPjc/875473.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/875473.htmlTechArticlePHP 引用計數器 通俗版解釋 概述 最近看PHP中的引用計數器部分,首先被各種繞暈,然后通過看博客和分析后,總結了一個比較通俗的解釋,...

總結

以上是生活随笔為你收集整理的php引用计数器,PHP 引用计数器 通俗版解释_PHP教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。