php值引用
『壹』 詳解php變數傳值賦值和引用賦值變數銷毀
本文實例為大家分享了PHP變數傳值賦值和引用賦值變數銷毀的具體代碼,供大家參考,具體內容如下
<?php
$a
=
100;
$b
=
200;
var_mp($a,$b);
//int(100)
int(200)
?>
php中,上面的代碼,變數是怎麼存放的呢?
上面的代碼變動下,將變數b賦值給變數a,會發生什麼?
<?php
$a
=
100;
$b
=
200;
$a
=
$b;/*多了這個*/
var_mp($a,$b);
//int(200)
int(200)
?>
問題來了,$a
=
$b,那麼是將變數a的指針指向了變數b指針所指向的位置?還是變數a指向的位置的值變了?
引用賦值和上面傳值賦值不同,引用賦值是兩個變數指向一個地方,一旦這樣,一改俱改。
怎麼引用賦值呢?變數名前加&即可,
$a
=
&$b;
這樣賦予變數a的就不僅僅是變數b的值,而是變數b的地址,變數a和變數b共同指向一個地址。
<?php
$a
=
100;
$b
=
200;
$a
=
&$b;
var_mp($a,$b);
//int(200)
int(200)
/*變數b引用賦值給變數a後,ab指向同一個地址,將會一改俱改,如下:*/
$a
=500;
var_mp($a,$b);//int(500)
int(500)
一改俱改
$b
=
700;
var_mp($a,$b);//int(700)
int(700)
一改俱改
?>
<?php
/*理解下面的話*/
$a
=
100;
//變數a賦值int
100
,100是基礎數據類型,不是變數,是存在變數指向位置的
$a
=
$b;
//變數b的值
賦值
給變數a,變數a,b各有各的指向,執行之後,各是各的。
$a
=
&$b;
//變數b的值的地址
賦值給變數
a
,變數a,b共用一個地址哦!一改俱改!
?>
<?php
/*
php中unset()是用來銷毀變數的,但很多時候,unset()只把變數給銷毀了,
內存中存放的該變數的值仍然沒有銷毀,也就是沒能達到我們想要的釋放內存的效果。
這里可以用
變數=null
的方法來釋放其內存
unset也會釋放內存的情況
1.
在變數值所佔空間超過255位元組長的時候,unset(變數)才會釋放內存
2.
只有當指向該值的所有變數都被銷毀後,地址才會被釋放(比如$a,$b都指向該值,僅僅unset($a);是不釋放的,$b還是正常存在的)(也要執行1的判斷)
*/
$a
=
200;
$b
=
&$a;
unset($a);
var_mp($a,$b);
//NULL
int(100)
?>
上面的代碼,執行到unset($a)時候,就是將變數a的指向斷開,同時將變數a扔出花名冊,從下圖可以看出,對變數b是沒有影響的。
但是,如果用$a
=
null;這種方式銷毀變數時,將會有如下影響:
<?php
$a
=
100;
$b
=
&$a;
$a
=
null;
var_mp($a,$b);
//NULL
NULL
?>
這種方式,釋放了內存,但是共用一個地址的另一個變數也受到了影響。
看看這兩種方式在數組上的應用:
<?php
$aaa
=
array(
'a'=>1,
'b'=>2
);
unset($aaa['a']);
print_r($aaa);
//Array
(
[b]
=>
2
)
,用unset,數組中這一項不存在了
$bbb
=
array(
'a'=>1,
'b'=>2
);
$bbb['a']
=
null;
print_r($bbb);
//Array
(
[a]
=>
[b]
=>
2
)
,用
=
null,數組中這一項還存在,只是為空了
?>
以上所述是小編給大家介紹的PHP變數傳值賦值和引用賦值變數銷毀詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
您可能感興趣的文章:PHP生成短網址的思路以及實現方法的詳解PHP錯誤提示It
is
not
safe
to
rely
on
the
system……的解決方法PHP隨機數函數rand()與mt_rand()的講解php微信掃碼支付
php公眾號支付PHP實現支持CURL字元串證書傳輸的方法PHP使用OB緩存實現靜態化功能示例PHP使用mysqli同時執行多條sql查詢語句的實例PHP中命名空間的使用例子PHP
SESSION機制的理解與實例PHP自動載入類文件函數__autoload的使用方法
『貳』 PHP裡面的「引用賦值」的存在意義是什麼用在哪裡
很多場景都可以用得到的,比如說:
可以將一個變數通過引用傳遞給函數,這樣該函數就可以修改其參數的值;
用引用傳遞變數。這是通過在函數內建立一個本地變數並且該變數在呼叫范圍內引用了同一個內容來實現的
還有很多網頁鏈接自己去看
『叄』 關於php的對象和引用!!
要理解這個問題,關鍵是要理解php的賦值機制。其實就是四個字:「寫時拷貝」。如下圖,當把a的值賦給b,a和b的關系屬於兩個變數指向同一內容。但是當其中一個變數賦值為不同於當前內容的值時,才會重新分配一塊內存來保存不同的變數,此時兩個變數的指向內容變成兩個,即所謂「寫時拷貝」。
如果理解了「寫時拷貝」的概念,我們繼續。在以下代碼後,繼續增加一次輸出。
classA{
public$foo=1;
}
$a=newA;
$b=$a;//$a,$b都是同一個標識符的拷貝
//($a)=($b)=<id>
$b->foo=2;
echo$a->foo." ";
$b = 3;echo $a->foo;// 此為新增代碼。根據寫時拷貝原理,此時a仍指向對象內容。而b被賦值為3,因此b指向內容為3。
如果到此還沒被搞蒙,繼續進一步。
通過「&」賦值,跟以上賦值是有區別的,屬於一塊內存地址,擁有兩個不同名稱的情況。也就是說,其一改變,另一個會跟著改變。在以下代碼後,繼續增加一次輸出。
$c=newA;
$d=&$c;//$c,$d是引用
//($c,$d)=<id>
$d->foo=2;
echo$c->foo." ";
$b = 3;echo $a->foo;// 此為新增代碼。此時a和b的值都指向3這個值,會報一個不是對象的錯誤,如果直接輸出a或b會發現,兩個變數的值都是3。現象請自行驗證。
『肆』 php中傳值與傳引用的區別
傳值要重新構造一份原參數的拷貝
傳引用則不需要
傳值對參數的修改不會改變原參數
傳引用時可以直接修改原參數
至於什麼時候傳引用,這看你的需要。
如果你的參數對象比較大(佔用內存很多),而函數本身不需要修改原對象時,這個時候就推薦傳引用,可以省去臨時對象的構造開銷。
如果你有實際修改原參數的需要,那麼就只能傳引用了。