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
//只有等到銷燬的時候就會自動拷貝一份。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的垃圾回收機制-引用計數PHP
- php完全銷燬sessionPHPSession
- 從filecoin銷燬機制看fil未來價值
- php原始碼02 -基本變數與記憶體管理機制PHP原始碼變數記憶體
- 引用型別變數的強制轉換型別變數
- php傳引用和全域性變數PHP變數
- PHP 引用變數名與 foreach 中 $val 同名時發生的變化PHP變數
- Makefile引用與環境變數變數
- 引用變數變數
- PHP 常量與變數PHP變數
- Android執行緒的建立與銷燬Android執行緒
- Nginx 與 PHP 的執行機制NginxPHP
- Service銷燬流程
- iOS單利的銷燬iOS
- 22_物件的銷燬物件
- OC記憶體管理--物件的生成與銷燬記憶體物件
- 在php中使用繫結變數的方法(Oracle SQL共享的機制)(轉)PHP變數OracleSQL
- JavaScript中的安全變數引用JavaScript變數
- 建立和銷燬物件物件
- awk引用shell變數變數
- PHP中GET與POST變數PHP變數
- PHP變數與常量學習PHP變數
- PHP底層的執行機制與原理PHP
- PHP 底層的執行機制與原理PHP
- Python高階編專題 - 類的建立與銷燬Python
- 詳解.NET依賴注入中物件的建立與“銷燬”依賴注入物件
- PHP 的 SESSION 機制PHPSession
- php之普通變數賦值、物件賦值、引用賦值的區別PHP變數賦值物件
- 【教程】(Angular)模版引用變數的魔法Angular變數
- VBScript中引用ASP的字串變數字串變數
- 爆炸銷燬動畫元件Explosions動畫元件
- 建立和銷燬物件(一)物件
- 變數和引用 Linux變數Linux
- 關於session的銷燬的問題Session
- PHP的可變變數名PHP變數
- 美國國防部機密檔案銷燬演算法演算法
- Less tips:宣告變數之前可以引用變數!變數
- PHP的引用計數是什麼意思?PHP