亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP中變量引用與變量銷毀機制分析

2024-05-04 23:27:23
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了PHP中變量引用與變量銷毀機制,較為深入的分析了PHP中變量的引用機制及其原理以及對應的變量的銷毀機制,有助于深入理解PHP程序設計原理,需要的朋友可以參考下
 
 

本文實例分析了PHP中變量引用與變量銷毀機制。分享給大家供大家參考。具體分析如下:

變量是php中一個非常重要的類型了,我們的有數據都通過變量或常量來進行操作,下文來看看變量引用與變量銷毀。

在php中,符號"&"表示引用。

1、看看不引用的情況是這樣子:

復制代碼代碼如下:
$a  = "hello world";//定義一個變量,下面賦值給$b
$b = $a;//這一步沒有在$a之前加符號&,像這樣子"$b= & $a"。沒有加&,實際上原理是會將變量$a復制拷貝一份,也就是內存中重新申請一個地址存儲變量$b了

ps:在php中,使用"="直接賦值,其實就是拷貝一份右邊的變量給b,會生成一份內存空間,結果可能是同樣的內容在內存中兩份。在有些關于php性能方面提到,這樣子會多占有內存空間。不過我接觸中,大部分人沒怎么注意,其實一般應用這樣子用產生的顯著差異并不明顯。不會看到什么效果,其實我本人也沒經常使用&進行引用,呵呵。只是我覺得,深入了解里面的實現原理,非常有必要。我喜歡關注原理性的東西。

 

2、使用符號&進行引用

復制代碼代碼如下:
$a  = "hello world";
$b = &$a;

使用引用,php引擎不會拷貝一份變量,其實就是將指針指向了$a在內存中的地址,$b中就是保存了這個指針。
所以使用引用的時候,把$b的值改變,$a也會跟著改變
比如:
復制代碼代碼如下:
$a  = "hello world";
$b = &$a;
$b = "test new value";//把b的值改掉,a的值也會跟著改變
echo $a;//輸出test new value,因為改變了b的值也會改變a的值。

 

經常在定義函數的時候看到像這樣的情況:

復制代碼代碼如下:
function test (& $param)
{
//函數定義的內容
$param++;
}

解釋:$param前面帶有引用,所以傳入進來的參數并不會在內存中拷貝一份,而是直接對原來的內存空間進行引用。所以:如果里對使用符號&傳入進來的變量值進行修改了,那么也會改變原來的內存空間中的值。
做個測驗如下:
復制代碼代碼如下:
$k = 8;
test($k);
echo $k;//結果$k的值被函數里面改變了,輸出9。

還會經??吹竭@樣子調用函數:
復制代碼代碼如下:
$return  = & test_func();

前面了解到php引擎的機制是:=會把右邊的內容拷貝一份給予左邊的變量。所以使用&就是將函數的結果不會進行拷貝一份,實際上我的理解是把指針給了左邊的變量。
什么是指針,以前學c語言中的概念。我的理解是就是:指針,指針,指向針(指南針,呵呵)。把指針看成是一個內存的地址容易理解點,計算機就知道去內存什么位置找數據了吧。這是淺顯的理解,深入的我不會,呵呵。

 

總結:使用引用是為了減少內存資源的占用。

php手冊中對引用的解釋如下:

在 PHP 中引用意味著用不同的名字訪問同一個變量內容。這并不像 C 的指針,替代的是,引用是符號表別名。注意在 PHP 中,變量名和變量內容是不一樣的,因此同樣的內容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——變量名是目錄條目,而變量內容則是文件本身。引用可以被看作是 Unix 文件系統中的 hardlink。

3、銷毀變量的時候。并不會改變原來的值。

試驗:$b = & $a;
既然改變$b的值,$a的值也跟著改變,假如把$b銷毀掉(內存中不占用空間了,不是null,也不是值為""),$a的值是不是也會跟著被刪掉呢?

其實國外有本php方面的書中專門提到了這個機制。2年前看的。不是很記得了。原則是就是刪除變量的時候,會自動拷貝。

其實這樣子,就是為了避免把$b給刪掉,造成把$a也給刪掉的問題。

復制代碼代碼如下:
<?php
$a = 'd';
$b = & $a;
$b = 8;//因為是引用了,所以把b的值改掉,a的值也跟著改為8了。
var_dump($b,$a);
unset($b);//調用unset刪除b變量,a變量不會刪除
var_dump($b,$a);//輸出null和8

調用unset刪除$b變量的時候,php引擎從變量符號表中發現:我要刪除的變量$b原來是引用了變量$a,這不好刪除啊,因為一刪除導致$a變量也沒了,所以就先把$a變量拷貝一份后在刪除$b變量。
關于php符號表:其實我的理解是,運行中所有變量名稱都記錄在里面,php來維護,具體的數據當然是存儲在內存中,php就是根據這個符號表去回收沒有用到的變量空間的,釋放內存空間)。去看看php的垃圾回收機制(釋放不再使用的內存空間),就是根據符號表進行的。
例子
復制代碼代碼如下:
<?php
$long="big_long_variable_name";
$$long="PHP";     /* 用存放在變量$long里的字符串作為新變量的變量名,等同于$big_long_variable_name="PHP"; */
$short=& $big_long_variable_name;  /* 取變量$big_long_variable_name的值賦給變量$short,此時$short的值為"PHP",等同于$short=& $$long; */
print "01 /$short is $short.";   /* "/$"是轉義序列,表示輸出一個美元符號$,下同。本語句的作用是輸出:01 $short is PHP. */
print "02 Long is $big_long_variable_name."; /* 輸出:02 Long is PHP. */
?>
<br />
<br />
<?php
$big_long_variable_name.=" rocks!"; /* 重新對$big_long_variable_name賦值。重新賦值過程中,由于在$big_long_variable_name的后面添加了.(點號),因而變量$big_long_variable_name此時的值應為原值("PHP")+新值(" rocks!"),即變量$big_long_variable_name當前完整的值為"PHP rocks!"。下同。*/
print "03 /$short is $short";   /* 輸出:03 $short is PHP rocks! */
print "04 Long is $big_long_variable_name"; /* 輸出:04 Long is PHP rocks! */
?>
<br />
<br />
05 $short is PHP rocks!
06 Long is PHP rocks!
<br />
<br />
<?php
$short.="Programming $short";   /* 重新對變量$short賦值。由于在$short后面添加了.(點號),因此請參考上例分析$short的值。*/
print "07 /$short is $short";   /* 輸出:07 $short is PHP rocks!Programming PHP rocks! */
print "08 Long is $big_long_variable_name"; /* 由于變量$short被重新賦值為Programming PHP rocks!,因而變量$big_long_variable_name的值也與$short一同被改變為"PHP rocks!Programming PHP rocks!"。本語句輸出:08 Long is PHP rocks!Programming PHP rocks!注意,如果是對具有相同值的一個變量進行銷毀unset( ),則另一個變量不適用于此種情況,即不會隨之被一同銷毀。*/
?>
<br />
<br />
09 $short is Programming PHP rocks!
10 Long is Programming PHP rocks!
<br />
<br />
<?php
$big_long_variable_name.="Web Programming $short";  /* 變量$big_long_variable_name被重新賦值,此時它完整的值應為PHP rocks!Programming PHP rocks!Web Programming PHP rocks!Programming PHP rocks!。變量$short的值此時與變量$big_long_variable_name一致。請分別參考第5處、第10處注釋進行分析。*/
print "11 /$short is $short";     /* 輸出:11 PHP rocks!Programming PHP rocks!Web Programming PHP rocks!Programming PHP rocks! */
print "12 Long is $big_long_variable_name";
?>
<br />
<br />
<?php
unset($big_long_variable_name);   /* 用unset( )銷毀變量$big_long_variable_name,變量$short不會因此受到任何影響。*/
print "13 /$short is $short";   /* 雖然銷毀了變量$big_long_variable_name,但$short沒有受到影響,它的值仍是最近一次被賦予的PHP rocks!Programming PHP rocks!Web Programming PHP rocks!Programming PHP rocks! */
print "14 Long is $big_long_variable_name."; /* 變量$big_long_variable_name已被銷毀,故而無值。輸出:14 Long is. */
snow;                                    
?>
<br />
<br />
<?php $short="No point TEST1";   /* 重新對變量$short賦值。由于這次沒有在$short后面添加.(點號),因此$short當前的值為"No point TEST1"。*/
print "15 /$short is $short.";   /* 輸出:15 $short is No point TEST1. */
$short="No point TEST2 $short";   /* 重新對變量$short賦值。沒在$short的后面添加.(點號),但引用了它自身最近一次的值"No point TEST1"。*/
print "16 /$short is $short.";   /* 輸出:16 $short is No point TEST2 No point TEST1. */

 

希望本文所述對大家的php程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久爱| 2019中文字幕全在线观看| 欧美色视频日本版| 国产精品福利网站| 国产精品网红福利| 久久影视电视剧免费网站| 久久精品国产亚洲精品2020| 狠狠久久五月精品中文字幕| 欧美电影在线观看| 日韩av最新在线观看| 俺去亚洲欧洲欧美日韩| 亚洲成人av在线| 2019中文在线观看| 国产精品jizz在线观看麻豆| 久久精品久久久久| 国产精品久久久久久久久影视| 日韩精品视频在线播放| 91精品在线观看视频| 91精品国产九九九久久久亚洲| 96sao精品视频在线观看| 国产成人精品免高潮费视频| 国产精品天天狠天天看| 国产精品com| 欧美性极品xxxx做受| 欧美大肥婆大肥bbbbb| 国产欧美日韩亚洲精品| 久久亚洲精品毛片| 精品国内产的精品视频在线观看| 尤物九九久久国产精品的特点| 日韩小视频网址| 日韩精品极品毛片系列视频| 国产suv精品一区二区三区88区| 97在线免费视频| 日韩激情av在线播放| 精品爽片免费看久久| 动漫精品一区二区| 国产盗摄xxxx视频xxx69| 欧美色欧美亚洲高清在线视频| 26uuu久久噜噜噜噜| 久久6免费高清热精品| 国产精品一区二区久久久| 日韩精品中文字幕有码专区| 欧美夫妻性生活xx| 国产不卡精品视男人的天堂| 亚洲成人免费在线视频| 96pao国产成视频永久免费| 在线精品国产欧美| 久久成人在线视频| 国语自产精品视频在免费| 久久影视免费观看| 亚洲天堂av在线免费| 日韩电影免费在线观看| 97色在线观看| 亚洲欧美日韩另类| 日韩欧美视频一区二区三区| 91精品视频大全| 伊人伊成久久人综合网小说| 日韩精品一区二区三区第95| 国产精品成久久久久三级| 主播福利视频一区| 国产91精品久久久| 国产成人短视频| 在线日韩中文字幕| 国产午夜精品全部视频播放| 欧美精品电影免费在线观看| 久久伊人色综合| 九九精品在线视频| 国产精品永久在线| 亚洲天堂av综合网| 久久中文精品视频| 国产玖玖精品视频| 久热精品视频在线观看| 欧美一级高清免费| 国产午夜精品理论片a级探花| 欧美情侣性视频| 亚洲人成网站免费播放| 日本欧美一级片| 亚洲一区制服诱惑| 欧美成人免费va影院高清| 欧美性猛交xxxxx水多| 国产精品久久一| 久久手机免费视频| 国产精品69精品一区二区三区| 中文字幕日韩欧美在线视频| www.欧美免费| 亚洲一区二区三区久久| 欧美黄网免费在线观看| 欧美在线视频免费播放| www国产精品视频| 91免费综合在线| 久久黄色av网站| 欧美性猛交xxxx偷拍洗澡| 日本精品视频网站| 欧美性理论片在线观看片免费| 国产精品扒开腿做爽爽爽视频| 久久免费精品日本久久中文字幕| 日韩激情av在线播放| 亚洲国产精品成人一区二区| 国产男女猛烈无遮挡91| 在线看福利67194| 成人激情视频在线观看| 国产脚交av在线一区二区| 中文字幕久久精品| 97精品一区二区三区| 亚洲第一区第二区| 国产精品入口尤物| 最近2019中文字幕在线高清| 亚洲激情在线视频| 国产精品88a∨| 国内精久久久久久久久久人| 欧美一区三区三区高中清蜜桃| 欧美高清电影在线看| 日韩免费观看高清| 国产日韩专区在线| 亚洲精品永久免费精品| 韩日精品中文字幕| 中文字幕成人在线| 中文字幕日韩av电影| 美女视频黄免费的亚洲男人天堂| 久久精品国产96久久久香蕉| 久久久久久久久久久国产| 亚洲天堂网站在线观看视频| 国产精品亚洲一区二区三区| 欧美精品在线网站| 成人有码视频在线播放| 国产精品久久久久久超碰| 成人欧美一区二区三区黑人孕妇| 中文字幕亚洲情99在线| 性欧美暴力猛交69hd| 97超视频免费观看| 国产精品免费观看在线| 亚洲精品福利视频| 欧美做爰性生交视频| 成人免费看吃奶视频网站| 日韩在线欧美在线国产在线| 激情久久av一区av二区av三区| 欧美成年人网站| 国产va免费精品高清在线| 亚洲丁香久久久| 亚洲午夜精品久久久久久久久久久久| 日韩精品高清在线| 国产一区二区三区在线观看网站| 亚洲а∨天堂久久精品喷水| 亚洲精品午夜精品| 国产精品久久久久久一区二区| 久久高清视频免费| 欧美中文在线视频| 精品久久久在线观看| 欧美成人在线影院| 欧美大尺度激情区在线播放| 夜夜躁日日躁狠狠久久88av| 国产欧美在线视频| 成人精品视频99在线观看免费| 国产精品网站视频| 亚洲精品在线91| 午夜精品www| 夜夜嗨av一区二区三区免费区| 欧美另类老肥妇| 久久免费视频观看| 亚洲aⅴ日韩av电影在线观看| 欧美成在线视频| 一二美女精品欧洲| 欧美电影免费观看电视剧大全| 国产成人精品综合|