在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 網頁設計教程 > 詳細頁面

php變量的引用賦值與傳值賦值的詳細介紹(代碼)

php變量的引用賦值與傳值賦值的詳細介紹(代碼)

更新時間:2025-12-05 文章作者:未知 信息來源:網絡 閱讀次數:

網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立...
網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。
本篇文章給大家帶來的內容是關于php變量的引用賦值與傳值賦值的詳細介紹(代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

一、使用 memory_get_usage() 查看PHP內存使用量

1. 傳值賦值

// 定義一個變量
$a = range(0, 10000);
var_dump(memory_get_usage());

// 定義變量b,將a變量的值賦值給b
$b = $a;
var_dump(memory_get_usage());

// 對a進行修改
// COW: Copy-On-Write
$a = range(0, 10000);
var_dump(memory_get_usage());

輸出結果:

int(989768)
int(989856)
int(1855608)

定義一個變量 $a = range(0, 10000);

3318694436-5b851f10a5d62_articlex.jpg

$b = $a;

4080624257-5b851f10ae86f_articlex.jpg

對a進行修改 $a = range(0, 10000);

1485385066-5b851f10b9b7b_articlex.jpg

PHP寫時復制機制(Copy-on-Write,也縮寫為COW)

顧名思義,就是在寫入時才真正復制一份內存進行修改。
COW最早應用在Unix系統中對線程與內存使用的優化,后面廣泛的被使用在各種編程語言中,如C++的STL等。
在PHP內核中,COW也是主要的內存優化手段。
在通過變量賦值的方式賦值給變量時,不會申請新內存來存放新變量的值,而是簡單的通過一個計數器來共用內存。只有在其中的一個引用指向變量的值發生變化時,才申請新空間來保存值內容,以減少對內存的占用。
在很多場景下PHP都使用COW進行內存的優化。比如:變量的多次賦值、函數參數傳遞,并在函數體內修改實參等。

2. 引用賦值

// 定義一個變量
$a = range(0, 10000);
var_dump(memory_get_usage());

// 定義變量b,將a變量的引用賦給b
$b = &$a;
var_dump(memory_get_usage());

// 對a進行修改
$a = range(0, 10000);
var_dump(memory_get_usage());

輸出結果:

int(989760)
int(989848)
int(989840)

定義一個變量 $a = range(0, 10000);

2340912772-5b851f108ae5b_articlex.jpg

定義變量b,將a變量的引用賦給b $b = &$a;

3774805543-5b851f10a5b60_articlex.jpg

對a進行修改 $a = range(0, 10000);

679713656-5b851f105a29e_articlex.jpg

二、使用 xdebug_debug_zval() 查看變量的引用情況

xdebug_debug_zval() 用于顯示變量的信息。需要安裝xdebug擴展。

1. 傳值賦值

$a = 1;
xdebug_debug_zval('a');

// 定義變量b,把a的值賦值給b
$b = $a;
xdebug_debug_zval('a');
xdebug_debug_zval('b');

// a進行寫操作
$a = 2;
xdebug_debug_zval('a');
xdebug_debug_zval('b');

輸出結果:

a: (refcount=1, is_ref=0)=1
a: (refcount=2, is_ref=0)=1
b: (refcount=2, is_ref=0)=1
a: (refcount=1, is_ref=0)=2
b: (refcount=1, is_ref=0)=1

定義變量 $a = 1;

$a = 1;
xdebug_debug_zval('a');

輸出

a: (refcount=1, is_ref=0)=1

refcount=1 表示該變量指向的內存地址的引用個數變為1
is_ref=0 表示該變量不是引用

1547227858-5b851f1059ea9_articlex.jpg

定義變量 $b ,把 $a 的值賦給 $b$b = $a;

$b = $a;
xdebug_debug_zval('a');
xdebug_debug_zval('b');

輸出

a: (refcount=2, is_ref=0)=1
b: (refcount=2, is_ref=0)=1

refcount=2 表示該變量指向的內存地址的引用個數變為2
is_ref=0 表示該變量不是引用

448181073-5b851f103fd97_articlex.jpg

對變量 $a 進行寫操作 $a = 2;

$a = 2;
xdebug_debug_zval('a');
xdebug_debug_zval('b');

輸出

a: (refcount=1, is_ref=0)=2
b: (refcount=1, is_ref=0)=1

因為COW機制,對變量 $a 進行寫操作時,會為變量 $a 新分配一塊內存空間,用于存儲變量 $a 的值。
此時 $a$b 指向的內存地址的引用個數都變為1。

1418161517-5b851f1059c5b_articlex.jpg

2. 引用賦值

$a = 1;
xdebug_debug_zval('a');

// 定義變量b,把a的引用賦給b
$b = &$a;
xdebug_debug_zval('a');
xdebug_debug_zval('b');

// a進行寫操作
$a = 2;
xdebug_debug_zval('a');
xdebug_debug_zval('b');
a: (refcount=1, is_ref=0)=1
a: (refcount=2, is_ref=1)=1
b: (refcount=2, is_ref=1)=1
a: (refcount=2, is_ref=1)=2
b: (refcount=2, is_ref=1)=2

定義變量 $a = 1;

$a = 1;
xdebug_debug_zval('a');

輸出

a: (refcount=1, is_ref=0)=1

refcount=1 表示該變量指向的內存地址的引用個數變為1
is_ref=0 表示該變量不是引用

604317911-5b851f103610d_articlex.jpg

定義變量 $b ,把 $a 的引用賦給 $b$b = &$a;

$b = &$a;
xdebug_debug_zval('a');
xdebug_debug_zval('b');

輸出

a: (refcount=2, is_ref=1)=1
b: (refcount=2, is_ref=1)=1

refcount=2 表示該變量指向的內存地址的引用個數變為2
is_ref=1 表示該變量是引用

442598603-5b851f0fc4cdd_articlex.jpg

對變量 $a 進行寫操作 $a = 2;

$a = 2;
xdebug_debug_zval('a');
xdebug_debug_zval('b');

輸出

a: (refcount=2, is_ref=1)=2
b: (refcount=2, is_ref=1)=2

因為變量 $a 和變量 $b 指向相同的內存地址,其實引用。
對變量 $a 進行寫操作時,會直接修改指向的內存空間的值,因此變量 $b 的值會跟著一起改變。

184090893-5b851f0fca6b2_articlex.jpg

三、當變量時引用時,unset()只會取消引用,不會銷毀內存空間

$a = 1;
$b = &$a;

// unset 只會取消引用,不會銷毀內存空間
unset($b);

echo $a;

輸出

1

定義變量 $a ,并將 $a 的引用賦給變量 $b

$a = 1;
$b = &$a;

2282715878-5b851f0fc3d75_articlex.jpg

銷毀 $b

unset($b);

4009950758-5b851f0fc8cdc_articlex.jpg

輸出 $a

雖然銷毀的 $b,但是 $a 的引用和內存空間依舊存在。

echo $a;

輸出

1

四、php中對象本身就是引用賦值

class Person
{
    public $age = 1;
}

$p1 = new Person;
xdebug_debug_zval('p1');

$p2 = $p1;
xdebug_debug_zval('p1');
xdebug_debug_zval('p2');

$p2->age = 2;
xdebug_debug_zval('p1');
xdebug_debug_zval('p2');
p1: (refcount=1, is_ref=0)=class Person { public $age = (refcount=2, is_ref=0)=1 }
p1: (refcount=2, is_ref=0)=class Person { public $age = (refcount=2, is_ref=0)=1 }
p2: (refcount=2, is_ref=0)=class Person { public $age = (refcount=2, is_ref=0)=1 }
p1: (refcount=2, is_ref=0)=class Person { public $age = (refcount=1, is_ref=0)=2 }
p2: (refcount=2, is_ref=0)=class Person { public $age = (refcount=1, is_ref=0)=2 }

實例化對象 $p1 = new Person;

$p1 = new Person;
xdebug_debug_zval('p1');

輸出

p1: (refcount=1, is_ref=0)=class Person { public $age = (refcount=2, is_ref=0)=1 }

refcount=1 表示該變量指向的內存地址的引用個數變為1
is_ref=0 表示該變量不是引用

$p1 賦給 $p2

$p2 = $p1;
xdebug_debug_zval('p1');
xdebug_debug_zval('p2');

輸出

p1: (refcount=2, is_ref=0)=class Person { public $age = (refcount=2, is_ref=0)=1 }
p2: (refcount=2, is_ref=0)=class Person { public $age = (refcount=2, is_ref=0)=1 }

refcount=2 表示該變量指向的內存地址的引用個數變為2

1112636063-5b851f0fcaf64_articlex.jpg

$p2 中的屬性 age 進行寫操作

$p2->age = 2;
xdebug_debug_zval('p1');
xdebug_debug_zval('p2');

輸出

p1: (refcount=2, is_ref=0)=class Person { public $age = (refcount=1, is_ref=0)=2 }
p2: (refcount=2, is_ref=0)=class Person { public $age = (refcount=1, is_ref=0)=2 }

因為php中對象本身就是引用賦值。對 $p2 中的屬性 age 進行寫操作時,會直接修改指向的內存空間的值,因此變量 $p1age 屬性的值會跟著一起改變。

五、實戰例題分析

/**
 * 寫出如下程序的輸出結果
 *
 * $d = ['a', 'b', 'c'];
 *
 * foreach($d as $k => $v)
 * {
 *    $v = &$d[$k];
 * }
 * 
 * 程序運行時,每一次循環結束后變量 $d 的值是什么?請解釋。
 * 程序執行完成后,變量 $d 的值是什么?請解釋。
 */

1. 第一次循環

推算出進入 foreach$v$d[$k] 的值

$k = 0
$v = 'a'
$d[$k] = $d[0] = 'a'

此時,$v$d[0] 在內存中分別開辟了一塊空間

![$v 和 $d[0] 在內存中分別開辟了一塊空間](http://md.ws65535.top/xsj/201...

$v = &$d[0] 改變了 $v 指向的內存地址

$v = &$d[0]

![$v = &$d[0] 改變了 $val 指向的內存地址](http://md.ws65535.top/xsj/201...

第一次循環后 $d 的值:

['a', 'b', 'c']

2. 第二次循環

進入 foreach$v 被賦值為 'b',此時$v指向的內存地址與 $d[0] 相同,且為引用,因此 $d[0] 的值被修改為 'b'

$v = 'b' => $d[0] = 'b'

![$v = ‘b’ => $d[0] = ‘b’](http://md.ws65535.top/xsj/201...

推算出進入 foreach$d[$k] 的值

$k = 1
$d[$k] = $d[1] = 'b'

![$d[2] = ‘b’](http://md.ws65535.top/xsj/201...

$v = &$d[1] 改變了 $v 指向的內存地址

$v = &$d[1]

![$v = &$d[1]](http://md.ws65535.top/xsj/201...

第二次循環后 $d 的值

['b', 'b', 'c']

3. 第三次循環

進入 foreach$v 被賦值為 'c',此時$v指向的內存地址與 $d[1] 相同,且為引用,因此 $d[1] 的值被修改為 'c'

$v = 'c' => $d[1] = 'c'

![$v = ‘c’ => $d[1] = ‘c’](http://md.ws65535.top/xsj/201...

推算出進入 foreach$d[$k] 的值

$k = 2
$d[2] = 'c'

![$d[2] = ‘c’](http://md.ws65535.top/xsj/201...

$v = &$d[2] 改變了 $v 指向的內存地址

$v = &$d[2]

![$v = &$d[2]](http://md.ws65535.top/xsj/201...

第三次循環后 $d 的值

['b', 'c', 'c']

4. 實測

$d = ['a', 'b', 'c'];

foreach ($d as $k=>$v)
{
    $v = &$d[$k];
    print_r($d);
}

print_r($d);

輸出:

Array
(
    [0] => a
    [1] => b
    [2] => c
)
Array
(
    [0] => b
    [1] => b
    [2] => c
)
Array
(
    [0] => b
    [1] => c
    [2] => c
)
Array
(
    [0] => b
    [1] => c
    [2] => c
)

相關推薦:

php 傳值賦值與引用賦值的區別_PHP教程

PHP變量賦值、代入給JavaScript中的變量,賦值javascript

以上就是php變量的引用賦值與傳值賦值的詳細介紹(代碼)的詳細內容,更多請關注php中文網其它相關文章!


網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 男女爽爽爽视频| 吴梦梦av在线| 男女视频网站在线观看| 日韩人妻一区二区三区蜜桃视频| 自拍偷拍21p| 激情五月婷婷基地| 91蝌蚪视频在线| 北条麻妃亚洲一区| 米仓穗香在线观看| 青春草国产视频| 久色视频在线播放| 成人黄色片视频| 天天爱天天操天天干| 五月花丁香婷婷| 免费成人深夜夜行网站视频| 成年丰满熟妇午夜免费视频 | 在线观看国产中文字幕| 成人中文字幕av| 亚洲精品自拍网| 日本一道在线观看| 九色在线视频观看| 中文字幕在线综合| 超碰10000| 日本三级免费观看| 久久人人爽av| 国产极品尤物在线| 一区二区三区四区毛片| 丰满人妻一区二区三区53号| 中国丰满人妻videoshd| 日本超碰在线观看| 久艹在线免费观看| 少妇黄色一级片| 全黄性性激高免费视频| 中文字幕视频在线免费观看| 日韩最新中文字幕| 欧美日韩亚洲第一| 三级在线免费观看| 国产成人黄色网址| av免费观看国产| 日韩在线一区视频| 欧美日韩国产精品激情在线播放| 成人日韩在线视频| www国产黄色| 黄色a级在线观看| 香蕉视频禁止18| 精品一卡二卡三卡| 久久亚洲中文字幕无码| 超碰97免费观看| 小泽玛利亚视频在线观看| 国产极品尤物在线| 欧美 亚洲 视频| 日本精品一区在线| www.这里只有精品| 午夜激情福利在线| 亚洲色欲综合一区二区三区| 成人区一区二区| 成人在线观看www| 亚洲一区二区图片| 久久精品国产99久久99久久久| 国产wwwxx| 超碰在线97免费| 久久精品.com| 任你操这里只有精品| 日本a在线免费观看| 欧美一级免费播放| 久久久久久久久久久视频| 国产美女主播在线播放| www.男人天堂网| 成人免费性视频| 国产原创popny丨九色 | 成人小视频在线观看免费| 亚洲成年人专区| 久久国产精品免费观看| 超级碰在线观看| 欧美成人精品免费| 每日在线更新av| 日日碰狠狠躁久久躁婷婷| 久久久久久久少妇| 超碰超碰在线观看| 婷婷视频在线播放| 成人在线视频一区二区三区| 男人添女荫道口喷水视频| 免费看国产曰批40分钟| 精品久久久久av| 亚洲18在线看污www麻豆| 国产免费中文字幕| 久久精品一二三四| 国产午夜福利100集发布| 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 中文字幕在线导航| 91免费视频污| 男人添女荫道口女人有什么感觉| 无罩大乳的熟妇正在播放| 国产主播中文字幕| 18视频在线观看娇喘| 国内精品在线观看视频| 91色国产在线| 毛片av在线播放| 国产精品久久久毛片| 国产尤物av一区二区三区| 国产野外作爱视频播放| 特色特色大片在线| 色综合手机在线| 日韩 欧美 视频| 波多野结衣三级在线| ww国产内射精品后入国产| 国产精品探花在线播放| 国产免费毛卡片| 国产 欧美 日韩 一区| 国产91色在线观看| 亚洲 高清 成人 动漫| 黄色a级在线观看| 日本不卡一区二区在线观看| 欧美爱爱视频免费看| 日韩在线视频在线| 肉色超薄丝袜脚交| 无需播放器的av| 无遮挡又爽又刺激的视频| 成人av在线不卡| xxx中文字幕| 在线观看免费视频污| 欧美日韩怡红院| 女性隐私黄www网站视频| 成人免费网站入口| 欧美中文字幕在线观看视频 | 亚洲人辣妹窥探嘘嘘| www.亚洲天堂网| 成人免费观看毛片| 免费在线激情视频| 四虎永久在线精品无码视频| 男人添女人下面高潮视频| 国产真人做爰毛片视频直播| 久久亚洲a v| 狠狠精品干练久久久无码中文字幕 | 国产性生交xxxxx免费| 日韩国产欧美亚洲| 欧美色图色综合| 丰满人妻中伦妇伦精品app| 久久久久久久久久久99| 国产日产欧美视频| 国产免费视频传媒| 亚洲精品自拍网| 99999精品| 国产精品无码免费专区午夜| 国产九九九九九| 美女黄色片视频| 国内精品国产三级国产aⅴ久| 992tv人人草| 国产一二三区在线播放| 国产91xxx| 一本一道久久a久久综合蜜桃| 99999精品| 成人中文字幕在线播放| 男人天堂1024| 超碰人人草人人| www.男人天堂网| 免费黄色一级网站| 深夜做爰性大片蜜桃| 成人黄色av片| 国产无遮挡猛进猛出免费软件| 影音先锋成人资源网站| 国产肥臀一区二区福利视频| 天天色天天综合网| 成人黄色大片网站| 亚洲一区日韩精品| 国产一二三在线视频| 99sesese| 久久久久免费看黄a片app| 国产一伦一伦一伦| 你懂的av在线| 伊人久久在线观看| 岛国毛片在线播放| 黄色片一级视频| 久久香蕉视频网站| 8x8x最新地址| 欧美亚洲一二三区| 国产亚洲精品久久久久久久| 免费观看成人在线视频| 日韩精品在线视频免费观看| www.se五月| 成人在线观看a| 欧美三级在线观看视频| ijzzijzzij亚洲大全| 欧美成人三级在线播放| 精品国产免费av| 成人精品视频在线播放| 五月天六月丁香| 亚洲精品视频三区| 91人人澡人人爽人人精品| 欧美色图色综合| 国产91xxx| 国产精品999视频| 少妇人妻在线视频| 免费一级特黄特色毛片久久看| 乱熟女高潮一区二区在线| 国产精品igao网网址不卡| 成年网站在线播放| 亚洲一级片网站| 91丝袜超薄交口足| 最新视频 - x88av|