成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁(yè) > 知識(shí)庫(kù) > PHP賦值的內(nèi)部是如何跑的詳解

PHP賦值的內(nèi)部是如何跑的詳解

熱門標(biāo)簽:兼職做地圖標(biāo)注好賺錢嗎 400 電話 辦理 亳州企業(yè)外呼系統(tǒng) 蘇州外呼系統(tǒng)有效果嗎 地圖標(biāo)注怎么做商戶驗(yàn)證 海南外呼系統(tǒng)方案 山東電銷卡外呼系統(tǒng)原理是什么 智能電銷語(yǔ)音機(jī)器人資訊 打開(kāi)百度地圖標(biāo)注

前言

在PHP中,一個(gè)變量被賦值,內(nèi)部到底經(jīng)歷了怎樣的邏輯判斷呢?

PHP在內(nèi)核中是通過(guò)zval這個(gè)結(jié)構(gòu)體來(lái)存儲(chǔ)變量的,它的定義在Zend/zend.h文件里

struct _zval_struct {zvalue_value value; /* 變量的值 */zend_uint refcount__gc;zend_uchar type; /* 變量當(dāng)前的數(shù)據(jù)類型 */zend_uchar is_ref__gc;};typedef struct _zval_struct zval;//在Zend/zend_types.h里定義的:typedef unsigned int zend_uint;typedef unsigned char zend_uchar;

使用xdebug的xdebug_debug_zval函數(shù)可以打印出變量的refcount,is_ref的值。

$a = 'Hello World';$b = $a;

以上內(nèi)容在內(nèi)核中怎么執(zhí)行呢?

zval *helloval;MAKE_STD_ZVAL(helloval);ZVAL_STRING(helloval, "Hello World", 1);zend_hash_add(EG(active_symbol_table), "a", sizeof("a"),helloval, sizeof(zval*), NULL);ZVAL_ADDREF(helloval); //這句很特殊,我們顯式的增加了helloval結(jié)構(gòu)體的refcountzend_hash_add(EG(active_symbol_table), "b", sizeof("b"),helloval, sizeof(zval*), NULL);

可以看出來(lái),當(dāng)變量賦值的時(shí)候,其實(shí)兩個(gè)變量指向的是同一個(gè)地址空間。那么問(wèn)題來(lái)了,如果指向同一個(gè)地址空間,那不是修改a,b也會(huì)跟著改變。這就涉及php的 寫時(shí)復(fù)制機(jī)制 。 以上代碼,如果后面一行為 $b = '123' 判斷過(guò)程如下:

  • 如果這個(gè)變量的zval部分的refcount小于2,代表沒(méi)有別的變量在用,則直接修改這個(gè)值
  • 否則,復(fù)制一份zval 的值,減少原zval的refcount的值,初始化新的zval的refcount,修改新復(fù)制的zval

簡(jiǎn)單變量

先引用賦值后普通賦值

var_dump(memory_get_usage());$a = '1234567890';xdebug_debug_zval('a');var_dump(memory_get_usage());$b = $a;xdebug_debug_zval('a','b');var_dump(memory_get_usage());$c = $a;xdebug_debug_zval('a','b','c');var_dump(memory_get_usage());$a = '1234567890';var_dump(memory_get_usage());$b = $a;var_dump(memory_get_usage());$c = $a;

輸出內(nèi)容如下:

int(121672)
a: (refcount=1, is_ref=0)='1234567890'

int(121776)
a: (refcount=2, is_ref=1)='1234567890'
b: (refcount=2, is_ref=1)='1234567890'

int(121824)
a: (refcount=2, is_ref=1)='1234567890'
b: (refcount=2, is_ref=1)='1234567890'
c: (refcount=1, is_ref=0)='1234567890'

int(121928)

$a 賦值,開(kāi)辟了104byte空間,變量a refcount=1,is_ref=0

$b 賦值,開(kāi)辟了48byte空間,變量a refcount=2,is_ref=1。48byte是符號(hào)表占用,a,b執(zhí)行同一個(gè)地址空間

$c 賦值,開(kāi)辟了104byte空間。由于a,b是引用,所以在c賦值的時(shí)候,會(huì)開(kāi)辟新空間,復(fù)制a zval內(nèi)容,并初始化refcount,is_ref,所以a 的refcount不變,c 的refcount=1

先普通賦值后引用賦值

var_dump(memory_get_usage());$a = '1234567890';xdebug_debug_zval('a');var_dump(memory_get_usage());$b = $a;xdebug_debug_zval('a','b');var_dump(memory_get_usage());$c = $a;xdebug_debug_zval('a','b','c');var_dump(memory_get_usage());

輸出內(nèi)容如下:

int(121672)

a: (refcount=1, is_ref=0)='1234567890'
int(121776)

a: (refcount=2, is_ref=0)='1234567890'
b: (refcount=2, is_ref=0)='1234567890'
int(121824)

a: (refcount=2, is_ref=1)='1234567890'
b: (refcount=1, is_ref=0)='1234567890'
c: (refcount=2, is_ref=1)='1234567890'
int(121928)

$a 賦值,開(kāi)辟了104byte空間,變量a refcount=1,is_ref=0

$b 賦值,開(kāi)辟了48byte空間,變量a refcount=2,is_ref=1。48byte是符號(hào)表占用,a,b指向同一個(gè)地址空間

$c 賦值,開(kāi)辟了104byte空間。由于a,c是引用,需要與b隔離開(kāi)來(lái),因此會(huì)賦值原有的zval,初始化zval,將a,c指向新復(fù)制的zval,同時(shí)原有的zval refcount-1

數(shù)組

$arr = [0=>'one'];
xdebug_debug_zval('arr');
$arr[1] = $arr;

xdebug_debug_zval('arr');

$arr[2] = $arr;
xdebug_debug_zval('arr');
unset($arr[1]);
xdebug_debug_zval('arr');
unset($arr[2]);
xdebug_debug_zval('arr');

輸出內(nèi)容如下:

arr: (refcount=1, is_ref=0)=array ( 0 => (refcount=1, is_ref=0)='one')
)
arr: (refcount=1, is_ref=0)=array (
0 => (refcount=2, is_ref=0)='one',
1 => (refcount=1, is_ref=0)=array (
0 => (refcount=2, is_ref=0)='one'
)
)
arr: (refcount=1, is_ref=0)=array (
0 => (refcount=3, is_ref=0)='one',
1 => (refcount=2, is_ref=0)=array (
0 => (refcount=3, is_ref=0)='one'),
2 => (refcount=1, is_ref=0)=array (
0 => (refcount=3, is_ref=0)='one',
1 => (refcount=2, is_ref=0)=array (...)
)
)
arr: (refcount=1, is_ref=0)=array (
0 => (refcount=3, is_ref=0)='one',
2 => (refcount=1, is_ref=0)=array (
0 => (refcount=3, is_ref=0)='one',
1 => (refcount=1, is_ref=0)=array (...)
)
)
arr: (refcount=1, is_ref=0)=array (
0 => (refcount=1, is_ref=0)='one'
)
$arr = [0=>'one'];xdebug_debug_zval('arr');$arr[1] = $arr;xdebug_debug_zval('arr');$arr[2] = $arr;xdebug_debug_zval('arr');unset($arr[1]);xdebug_debug_zval('arr');unset($arr[2]);xdebug_debug_zval('arr');

輸出內(nèi)容如下:

arr: (refcount=1, is_ref=0)=array (
0 => (refcount=1, is_ref=0)='one'
)
arr: (refcount=2, is_ref=1)=array (
0 => (refcount=1, is_ref=0)='one',
1 => (refcount=2, is_ref=1)=...
)
arr: (refcount=3, is_ref=1)=array (
0 => (refcount=2, is_ref=0)='one',
1 => (refcount=3, is_ref=1)=...,
2 => (refcount=2, is_ref=0)=array (
0 => (refcount=2, is_ref=0)='one',
1 => (refcount=3, is_ref=1)=...,
2 => (refcount=2, is_ref=0)=...)
)
arr: (refcount=2, is_ref=1)=array (
0 => (refcount=2, is_ref=0)='one',
2 => (refcount=2, is_ref=0)=array (
0 => (refcount=2, is_ref=0)='one',
1 => (refcount=2, is_ref=1)=...,
2 => (refcount=2, is_ref=0)=...)
)
arr: (refcount=2, is_ref=1)=array (
0 => (refcount=2, is_ref=0)='one'
)

上面段測(cè)試代碼很相似,差別只在arr[1]是否是引用賦值。

arr[1]非引用賦值的情況,arr[0]的refcount = 賦值次數(shù)+1,執(zhí)行兩次unset之后,arr,arr[0]的refcount都跟開(kāi)始定義的時(shí)候一致。 arr[1]引用賦值的情況,arr[0]的refcount = 非引用賦值次數(shù)+1,執(zhí)行兩次unset之后,arr,arr[0] 的refcount都無(wú)法回到定義的時(shí)候的值。

主要原因在于arr[1]引用賦值,構(gòu)成一個(gè)遞歸操作。 但是如果,至于這個(gè)refcount,真的說(shuō)不明白。當(dāng)沒(méi)有arr[2]賦值的時(shí)候,執(zhí)行unset, arr refcount能回到1 。從下面這張圖更加清晰看出內(nèi)部遞歸引用


當(dāng)出現(xiàn)上面這種情況,refcount本該=1,但實(shí)際上面沒(méi)有被設(shè)置為1,這種情況就會(huì)出現(xiàn)內(nèi)存泄漏。上面代碼循環(huán)執(zhí)行100次,內(nèi)存從一開(kāi)始121096 上升到169224,內(nèi)存占用上升了5k 。

對(duì)象

$user = new User();
 $m = $user;
 $user->user ='';
 $user->name = 'sdfsdfs';
 xdebug_debug_zval('user','m');

以上內(nèi)容輸出

(refcount=2, is_ref=0)=class User {
public $name = (refcount=1, is_ref=0)='sdfsdfs';
public $model = (refcount=1, is_ref=0)=NULL;
public $user = (refcount=1, is_ref=0)=''
}
m: (refcount=2, is_ref=0)=class User {
public $name = (refcount=1, is_ref=0)='sdfsdfs';
public $model = (refcount=1, is_ref=0)=NULL;
public $user = (refcount=1, is_ref=0)=''
}

xdebug給出的is_ref=0。refcount與普通變量一直。但是類的賦值是引用賦值。

$user = new User();
 $user->user = $user;
 $user->name = 'sdfsdfs';
 xdebug_debug_zval('user');
 unset($user);

上面內(nèi)容輸出:

user: (refcount=2, is_ref=0)=class User { public $name = (refcount=1, is_ref=0)='sdfsdfs'; public $user = (refcount=2, is_ref=0)=... }

這里由于類的賦值是引用賦值,索引也構(gòu)成了一個(gè)遞歸操作,這樣也會(huì)跟數(shù)組一樣出現(xiàn)內(nèi)存泄漏的情況。對(duì)以下代碼個(gè)自行100次

$user = new User();
 $user->user = $user;
 $user->name = 'sdfsdfs';
 xdebug_debug_zval('user');
 unset($user);
$user = new User();
 $user->user = new Order();
 $user->name = 'sdfsdfs';
 xdebug_debug_zval('user');
 unset($user);

第一段代碼前后內(nèi)存差1408 byte. 第二段代碼差208 byte。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:
  • php 傳值賦值與引用賦值的區(qū)別
  • PHP讀取txt文件的內(nèi)容并賦值給數(shù)組的代碼
  • 詳解PHP數(shù)組賦值方法
  • php foreach 使用(與運(yùn)算符)引用賦值要注意的問(wèn)題
  • php中給js數(shù)組賦值方法
  • PHP5 的對(duì)象賦值機(jī)制介紹
  • PHP變量賦值、代入給JavaScript中的變量
  • php數(shù)組操作之鍵名比較與差集、交集賦值的方法
  • PHP基礎(chǔ)陷阱題(變量賦值)

標(biāo)簽:綏化 呼倫貝爾 萊蕪 金華 安康 紹興 清遠(yuǎn) 溫州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP賦值的內(nèi)部是如何跑的詳解》,本文關(guān)鍵詞  PHP,賦值,的,內(nèi)部,是,如何,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP賦值的內(nèi)部是如何跑的詳解》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于PHP賦值的內(nèi)部是如何跑的詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产欧美日韩精品一区二区三区| 精品国产乱码久久久久久久软件| 超碰超碰超碰超碰超碰| 日韩亚洲精品视频| 欧美午夜在线观看| 亚洲资源在线播放| 欧美高清在线一区二区| www亚洲国产| 国产麻花豆剧传媒精品mv在线| 男女午夜激情视频| 欧美一区二区视频免费观看| 丰满圆润老女人hd| 国产日韩欧美一区二区三区| 婷婷色中文字幕| 五月天亚洲综合| 日韩精品一区中文字幕| 精品乱码一区二区三区四区| 亚洲激情自拍偷拍| 欧美大片在线观看一区二区| 久久青草国产手机看片福利盒子| 免费看成人人体视频| 成人精品福利视频| 亚洲欧洲三级| 蜜桃视频m3u8在线观看| 欧美性感一类影片在线播放| 激情综合色播五月| 老司机成人在线| 天堂网在线.www天堂在线视频| av片在线观看免费| 99热这里只有精品5| 中文字幕成人av| 亚洲综合中文字幕68页| 日韩电影中文字幕av| 欧美人妻精品一区二区免费看| xvideos.蜜桃一区二区| 国内自拍亚洲| 一区二区三区免费在线观看视频| 国产主播福利在线| 国产精品国产精品国产专区| 欧美激情精品久久久久久免费| 91蝌蚪porny| 狼人精品一区二区三区在线| 国产精品污www在线观看| 成人午夜网址| 成人久久久久| 亚洲一二三四区| 欧美伊人精品成人久久综合97| 日本大臀精品| 中文字幕21页在线看| 日本理论片午伦夜理片在线观看| 伊人色综合久久| 91国内揄拍国内精品对白| 少妇一晚三次一区二区三区| 国产精品老女人精品视频| 无码av免费精品一区二区三区| 在线看的毛片| 狠狠色丁香九九婷婷综合五月| 国产一区二区视频在线播放| 九九色在线视频| 加勒比一区二区三区| av网站一区二区三区| 精品亚洲成av人在线观看| 欧美一级在线免费观看| 中文字幕第15页| 日韩电影免费在线观看| 日韩欧美国产高清91| 欧美日韩三级在线| 亚洲精品一区在线观看香蕉| 擼擼色在线看观看免费| 久久国产直播| 欧美精品一二三四区| 一区二区三区在线观看欧美| 国产精品资源网站| jizzjizzji欧美| 日韩欧美一区二区三区久久婷婷| 精品国产第一区二区三区观看体验| 黑人巨大精品欧美一区二区三区| 亚洲人妖av一区二区| 最近中文av字幕在线中文| 亚洲一区中文日韩| 亚洲女人被黑人巨大进入al| 欧美深性狂猛ⅹxxx深喉| 国产啪精品视频网站| av中文资源在线| 欧美电影三区| heyzo高清中文字幕在线| 蜜桃av.网站在线观看| 国产在线成人| 欧美精品色哟哟| 亚洲精品一区二区三区av| 你懂得在线网址| 久久只精品国产| 人妻与黑人一区二区三区| 中文字幕第八页| 午夜伦理一区二区| 亚洲欧洲精品一区二区三区| 欧美一卡二卡三卡四卡| 欧美精品久久久久久久久久久| 欧美在线视频第一页| 潘金莲一级淫片aaaaa| 在线观看老湿视频福利| 日韩国产一区| 天堂va久久久噜噜噜久久va| 国产在线观看免费视频软件| 视频一区二区在线| 久久久久久亚洲精品杨幂换脸| 在线日本欧美| 国产一区二区三区直播精品电影| 国产网友自拍电影在线| 美女做暖暖视频免费在线观看全部网址91| 国产精品亚洲人成在99www| 欧洲一区在线电影| 亚洲男人天堂av网| 国产精品免费一区二区三区| 日韩在线观看一区二区三区| 亚洲少妇一区| 亚洲精品免费看| 精品熟妇无码av免费久久| 国产欧美一区二区精品秋霞影院| 天天夜夜亚洲| 免费 成 人 黄 色| 欧美专区在线| 亚洲欧美色图区| 欧美激情一区二区视频| 国产福利影院在线观看| 欧美日本另类xxx乱大交| 在线日韩网站| 色涩成人影视在线播放| 中文字幕日韩欧美在线| 在线看片黄色| 欧美五级在线观看视频播放| 国产黑人绿帽在线第一区| 日韩午夜小视频| 国产精品福利一区二区三区| 一本色道久久88综合亚洲精品ⅰ| 亚洲熟妇无码一区二区三区导航| 日韩精品丝袜美腿| 996久久国产精品线观看| 日日狠狠久久偷偷四色综合免费| 国产韩国精品一区二区三区| 特级毛片在线免费观看| 国产91在线播放九色快色| 在线宅男视频| 日韩精品欧美精品| 国产成人av在线播放| 26uuu国产精品视频| 久久婷婷五月综合| 黄色aaa级片| 一区二区三区韩国免费中文网站| 日韩欧美不卡一区| 欧美激情一二三区| 蜜臀av国产精品久久久久| 亚洲乱码久久| 少妇久久久久久| 影音先锋男人资源站| 91成人在线播放| 久草精品视频| 日韩欧美激情一区二区| 亚洲kkk444kkk在线观看| 色多多国产成人永久免费网站| 亚洲av无码一区二区乱子伦| 亚洲砖区区免费| 亚洲欧美一区二区精品久久久| 色婷婷狠狠18禁久久| 天天干狠狠干| 久久久久久久尹人综合网亚洲| 国产精品美女久久久久久久久久久| 激情文学综合| 国产999精品久久久影片官网| 青青草视频在线观看免费| 久草在线资源福利站| 五月天久久狠狠| 中出中文字幕| 久久香蕉一区| 无码人妻少妇伦在线电影| 92国产精品久久久久首页| 在线国产中文字幕| 亚洲天堂最新地址| 亚洲久草在线视频| 久久久精品久久久久| 色吧亚洲视频| 日本不卡视频| 日韩在线免费视频观看| 久久久pmvav| 91九色成人| 一级欧美视频| 国产精品第一页在线观看| 美女视频黄免费的亚洲男人天堂| 不卡视频一二三| 日韩欧美精品电影| 在线中文字幕网站| 日本中文字幕不卡免费| 爱情岛论坛亚洲首页入口章节| 日韩a在线观看| 国产精品午夜福利| 变态另类ts人妖一区二区| 欧美日韩爱爱| 国产精品99精品无码视| 变态另类丨国产精品| 无码黑人精品一区二区| 91精品免费观看| 天天干在线影院| 欧美人与牲禽动交com| 亚洲精品第一国产综合野| 久久久久久久久久一级| 欧美一区二区免费在线观看| 自拍偷拍欧美日韩| 日本少妇全体裸体洗澡| 国严精品久久久久久亚洲影视| 成人1区2区| 国产网友自拍电影在线| 最新欧美电影| 亚洲精美色品网站| 国内精品福利视频| 97成人超碰免| 91国产中文字幕| 最新国产一区二区| 丁香资源影视免费观看| 中文字幕福利视频| 亚洲中文字幕无码中文字| 999精品网站| 日韩一区二区三区高清在线观看| 亚洲综合色视频| 亚洲人妖av一区二区| 日韩特级黄色片| 55夜色66夜色国产精品视频| 毛片毛片毛片毛片毛| 亚洲男人天堂九九视频| 奇米精品一区二区三区在线观看一| 伊人久久噜噜噜躁狠狠躁| 天堂a√中文在线| 美女精品一区最新中文字幕一区二区三区| 亚洲三级视频在线观看| 亚洲第一伊人| 国产成年人免费视频| 91久久精品国产91久久| 9i在线看片成人免费| 欧美性色黄大片人与善| 国产精品久久二区二区| 9自拍视频在线观看| 精品亚洲免费视频| 激情不卡一区二区三区视频在线| 欧美激情精品久久久久久久变态| 欧美性猛交xxxx乱大交hd| 日本久久久久久久久久久久| 69久久99精品久久久久婷婷| 亚洲精品一区av在线播放| 色诱av手机版| 亚洲激情网址| 白浆在线视频| 亚洲欧美久久久久| 日本激情视频在线观看| 欧美做受777cos| 日韩精品成人| 男男h黄动漫啪啪无遮挡软件| 91精品久久久久久久久久久久久| 97影院理论片在线播放| 美女扒开内裤让男人桶| 欧美午夜影院| 中国日韩欧美久久久久久久久| 国产高清一区二区三区| 香蕉成人伊视频在线观看| 美国av在线播放| 欧美日韩在线中文字幕| 99久久99久久精品免费看小说.| 亚洲成年人视频| 亚洲欧洲在线观看av| 麻豆精品新av中文字幕| 亚洲一区二区三区四区在线| 欧美日韩人妻精品一区二区三区| 一道精品一区二区三区| 久久影院模特热| 青青艹在线视频| 久久亚洲精品成人| 你真棒插曲来救救我在线观看| 婷婷五月色综合| 日韩激情文学| 久久免费精品国产久精品久久久久| 国产三级理论片| xxxx18hd亚洲hd捆绑| 精品久久久久久亚洲综合网| 四虎永久成年免费影院| 亚洲午夜一区| 国产精品亚洲欧美日韩一区在线| 国产精品免费人成网站酒店| 中文资源在线网| 国产乡下妇女做爰视频| 里番精品3d一二三区| yellow在线观看网址| 喜爱夜蒲2在线| 国内精品久久久久伊人av| 久久99国产精品久久久久久久久| 最新天堂在线视频| 天天色综合天天| 噜噜噜久久亚洲精品国产品小说| 无码人妻精品一区二区三区在线| 亚洲一区第一页| 欧美日韩在线播放三区| 国产乱理伦片a级在线观看| 一区二区视频在线看| 中文字幕精品在线不卡| 人妻视频一区二区三区| 性色av一区二区三区四区| 成人动漫视频在线| 亚洲高清在线看| 偷拍一区二区三区四区| 国产精品香蕉国产| 欧美成人短视频| 911美女片黄在线观看游戏| 国产a级片视频| 亚洲午夜精品在线观看| 国产日韩欧美日韩| 午夜在线播放| 男人插曲女人的视频| 久久97超碰国产精品超碰| 日本在线小视频| 91色乱码一区二区三区| 午夜免费视频在线国产| 国产av一区二区三区精品| 欧美第一黄网免费网站| 欧美日韩一区在线| 成人国产精品免费观看视频| 欧美乱做爰xxxⅹ久久久| xxxx欧美18另类的高清| 另类专区欧美蜜桃臀第一页| 日韩在线观看视频一区| 8×8x拔擦拔擦在线视频网站| 意大利激情丛林无删减版dvd|