最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php 變量引用與變量銷毀機制詳細(xì)介紹

 更新時間:2016年12月05日 08:40:19   投稿:lqh  
變量是php中一個非常重要的類型了,我們的有數(shù)據(jù)都通過變量或常量來進(jìn)行操作,下文來看看變量引用與變量銷毀吧,需要的朋友可以參考下

php 變量引用與變量銷毀機制

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

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

$a = “hello world”;//定義一個變量,下面賦值給$b
$b = $a;//這一步?jīng)]有在$a之前加符號&,像這樣子”$b= & $a”。沒有加&,實際上原理是會將變量$a復(fù)制拷貝一份,也就是內(nèi)存中重新申請一個地址存儲變量$b了

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

2、使用符號&進(jìn)行引用

$a = “hello world”;
$b = & $a;

使用引用,php引擎不會拷貝一份變量,其實就是將指針指向了$a在內(nèi)存中的地址,$b中就是保存了這個指針。
所以使用引用的時候,把$b的值改變,$a也會跟著改變

比如:

$a = “hello world”;
$b = & $a;
$b = “test new value”;//把b的值改掉,a的值也會跟著改變
echo $a;//輸出test new value,因為改變了b的值也會改變a的值。
=====================================
經(jīng)常在定義函數(shù)的時候看到像這樣的情況:
function test (& $param)
{
//函數(shù)定義的內(nèi)容
$param++;
}

解釋:$param前面帶有引用,所以傳入進(jìn)來的參數(shù)并不會在內(nèi)存中拷貝一份,而是直接對原來的內(nèi)存空間進(jìn)行引用。所以:如果里對使用符號&傳入進(jìn)來的變量值進(jìn)行修改了,那么也會改變原來的內(nèi)存空間中的值。

做個測驗如下:

$k = 8;
test($k);
echo $k;//結(jié)果$k的值被函數(shù)里面改變了,輸出9。
還會經(jīng)??吹竭@樣子調(diào)用函數(shù):
$return = & test_func();

前面了解到php引擎的機制是:=會把右邊的內(nèi)容拷貝一份給予左邊的變量。所以使用&就是將函數(shù)的結(jié)果不會進(jìn)行拷貝一份,實際上我的理解是把指針給了左邊的變量。

什么是指針,以前學(xué)c語言中的概念。我的理解是就是:指針,指針,指向針(指南針,呵呵)。把指針看成是一個內(nèi)存的地址容易理解點,計算機就知道去內(nèi)存什么位置找數(shù)據(jù)了吧。這是淺顯的理解,深入的我不會,呵呵。

總結(jié):使用引用是為了減少內(nèi)存資源的占用。

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

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

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

試驗:$b = & $a;

既然改變$b的值,$a的值也跟著改變,假如把$b銷毀掉(內(nèi)存中不占用空間了,不是null,也不是值為””),$a的值是不是也會跟著被刪掉呢?

其實國外有本php方面的書中專門提到了這個機制。2年前看的。不是很記得了。原則是就是刪除變量的時候,會自動拷貝。
其實這樣子,就是為了避免把$b給刪掉,造成把$a也給刪掉的問題。

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

調(diào)用unset刪除$b變量的時候,php引擎從變量符號表中發(fā)現(xiàn):我要刪除的變量$b原來是引用了變量$a,這不好刪除啊,因為一刪除導(dǎo)致$a變量也沒了,所以就先把$a變量拷貝一份后在刪除$b變量。

關(guān)于php符號表:其實我的理解是,運行中所有變量名稱都記錄在里面,php來維護(hù),具體的數(shù)據(jù)當(dāng)然是存儲在內(nèi)存中,php就是根據(jù)這個符號表去回收沒有用到的變量空間的,釋放內(nèi)存空間)。去看看php的垃圾回收機制(釋放不再使用的內(nèi)存空間),就是根據(jù)符號表進(jìn)行的。

例子

<?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.";  /* "/$"是轉(zhuǎn)義序列,表示輸出一個美元符號$,下同。本語句的作用是輸出: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此時的值應(yīng)為原值("PHP")+新值(" rocks!"),即變量$big_long_variable_name當(dāng)前完整的值為"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一同被改變?yōu)?PHP rocks!Programming PHP rocks!"。本語句輸出:08 Long is PHP rocks!Programming PHP rocks!注意,如果是對具有相同值的一個變量進(jìn)行銷毀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被重新賦值,此時它完整的值應(yīng)為PHP rocks!Programming PHP rocks!Web Programming PHP rocks!Programming PHP rocks!。變量$short的值此時與變量$big_long_variable_name一致。請分別參考第5處、第10處注釋進(jìn)行分析。*/
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當(dāng)前的值為"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. */

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • 跟我學(xué)Laravel之路由

    跟我學(xué)Laravel之路由

    本文主要介紹了Lavarvel框架的路由的相關(guān)概念以及示例,非常的實用,有需要的朋友可以參考下
    2014-10-10
  • php 驗證碼實例代碼

    php 驗證碼實例代碼

    首先驗證碼的原理就是,畫一張圖片,然后在這張圖片上寫一些字,然后加一些干擾的線條,像素點之類的東西就ok了,這里要使用php那就要知道php中畫圖的函數(shù)是那些,然后拿來用便是了。
    2010-06-06
  • php中創(chuàng)建和調(diào)用webservice接口示例

    php中創(chuàng)建和調(diào)用webservice接口示例

    這篇文章主要介紹了php中創(chuàng)建和調(diào)用webservice接口示例,包括webservice基本知識、webservice服務(wù)端例子、webservice客戶端例子,需要的朋友可以參考下
    2014-07-07
  • YII框架實現(xiàn)自定義第三方擴(kuò)展操作示例

    YII框架實現(xiàn)自定義第三方擴(kuò)展操作示例

    這篇文章主要介紹了YII框架實現(xiàn)自定義第三方擴(kuò)展操作,結(jié)合實例形式分析了Yii框架自定義第三方擴(kuò)展操作的步驟與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2019-04-04
  • PHP長網(wǎng)址與短網(wǎng)址的實現(xiàn)方法

    PHP長網(wǎng)址與短網(wǎng)址的實現(xiàn)方法

    這篇文章主要介紹了PHP長網(wǎng)址與短網(wǎng)址的實現(xiàn)方法,需要的朋友可以參考下
    2017-10-10
  • 基于thinkphp6.0的success、error實現(xiàn)方法

    基于thinkphp6.0的success、error實現(xiàn)方法

    這篇文章主要介紹了基于thinkphp6.0的success、error實現(xiàn)方法,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • Yii2如何批量添加數(shù)據(jù)

    Yii2如何批量添加數(shù)據(jù)

    批量添加這個操作,在實際開發(fā)中經(jīng)常用得到,今天小編抽空給大家整理些有關(guān)yii2批量添加的問題,感興趣的朋友一起看看吧
    2016-05-05
  • 使用Appcan客戶端自動更新PHP版本號(全)

    使用Appcan客戶端自動更新PHP版本號(全)

    在項目開發(fā)過程中遇到app端自動更新,查閱了相關(guān)資料然后把Appcan客戶端自動更新PHP版本號的方法整理出來,有需要的小伙伴可以來參考下
    2015-07-07
  • php 批量替換程序的具體實現(xiàn)代碼

    php 批量替換程序的具體實現(xiàn)代碼

    這篇文章介紹了php 批量替換程序的具體實現(xiàn)代碼,有需要的朋友可以參考一下
    2013-10-10
  • ThinkPHP驗證碼使用簡明教程

    ThinkPHP驗證碼使用簡明教程

    驗證碼功能主要是為了防止網(wǎng)站登錄功能被刷,但是根據(jù)現(xiàn)在市面上常見的驗證碼功能,很容易被繞過,所以如果想讓網(wǎng)站足夠安全的話,最好再研究深入一些
    2014-03-03

最新評論

育儿| 大田县| 即墨市| 吉隆县| 莒南县| 云和县| 车致| 株洲市| 沙湾县| 桐庐县| 宽甸| 巫溪县| 达拉特旗| 交口县| 洪洞县| 阿鲁科尔沁旗| 安阳市| 德庆县| 张家港市| 塔河县| 留坝县| 南丰县| 无锡市| 镶黄旗| 张掖市| 仙居县| 景谷| 福贡县| 嘉禾县| 桦南县| 桑日县| 武鸣县| 昌黎县| 南漳县| 秦皇岛市| 南溪县| 武夷山市| 麻阳| 万安县| 麻城市| 惠东县|