PHP中變數引用與變數銷毀機制分析,php銷毀_PHP教程

來源:互聯網
上載者:User

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. */
?>




<?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! */
?>




05 $short is PHP rocks!
06 Long is PHP rocks!




<?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( ),則另一個變數不適用於此種情況,即不會隨之被一同銷毀。*/
?>




09 $short is Programming PHP rocks!
10 Long is Programming PHP rocks!




<?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";
?>




<?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;
?>




<?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程式設計有所協助。

http://www.bkjia.com/PHPjc/912291.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/912291.htmlTechArticlePHP中變數引用與變數銷毀機制分析,php銷毀 本文執行個體分析了PHP中變數引用與變數銷毀機制。分享給大家供大家參考。具體分析如下: 變數...

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.