abstract:在 PHP 中引用意味著用不同的名字訪問同一個變量內(nèi)容。這并不像 C 的指針,替代的是引用是符號表別名。注意在 PHP 中,變量名和變量內(nèi)容是不一樣的,因此同樣的內(nèi)容可以有不同的名字。 引用傳遞function foo ( &$var ){$var++;} foo ($a); // 注意在函數(shù)調(diào)用時
在 PHP 中引用意味著用不同的名字訪問同一個變量內(nèi)容。這并不像 C 的指針,替代的是引用是符號表別名。注意在 PHP 中,變量名和變量內(nèi)容是不一樣的,因此同樣的內(nèi)容可以有不同的名字。
引用傳遞
function foo ( &$var ){$var++;} foo ($a); // 注意在函數(shù)調(diào)用時沒有引用符號 - 只有函數(shù)定義中有。光是函數(shù)定義就足夠使參數(shù)通過引用來正確傳遞了 引用返回 function &init_users(){ ... return $cls;} 使用引用返回,必須在兩個地方都用&符號 $user = & init_users(); function &init_users(){ ...return $cls;} 取消引用當(dāng) unset 一個引用,只是斷開了變量名和變量內(nèi)容之間的綁定。這并不意味著變量內(nèi)容被銷毀了。 $a="hihaha";$b= &$a;unset($b);echo$a;// shows "hihaha"
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
這里有個php引用的例子,好好看一遍:
<?php //if you do: $a="hihaha"; $b= &$a; $c="eita"; $b=$c; echo$a;// shows "eita" $a="hihaha"; $b= &$a; $c="eita"; $b= &$c; echo$a;// shows "hihaha" $a="hihaha"; $b= &$a; $b=null; echo$a;// shows nothing (both are set to null) $a="hihaha"; $b= &$a; unset($b); echo$a;// shows "hihaha" $a="hihaha"; $b= &$a; $c="eita"; $a=$c; echo$b;// shows "eita" $a="hihaha"; $b= &$a; $c="eita"; $a= &$c; echo$b;// shows "hihaha" $a="hihaha"; $b= &$a; $a=null; echo$b;// shows nothing (both are set to null) $a="hihaha"; $b= &$a; unset($a); echo$b;// shows "hihaha" ?>
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PHP unset全局變量在用戶函數(shù)中只能銷毀局部變量,并不能銷毀全局變量。(從PHP4開始unset已經(jīng)不再是一個函數(shù)了,而是一個語句)。如果需要銷毀全局變量的應(yīng)該如何做呢?也很簡單,用$GLOBALS數(shù)組來實(shí)現(xiàn)。
< ?PHP function foo() { unset($GLOBALS['bar']); // 而不是unset($bar) } $bar = “something”; foo(); var_dump($bar); ?>
對于unset:
1. 該函數(shù)只有在變量值所占空間超過256字節(jié)長的時候才會釋放內(nèi)存
2. 只有當(dāng)指向該值的所有變量(比如有引用變量指向該值)都被銷毀后,地址才會被釋放(也要執(zhí)行1的判斷)
也就是檢查有無其他變量綁定,有的話就不會釋放了。就像這個例子:
$a="hihaha"; $b= &$a; unset($b); echo$a;// shows "hihaha"
所以建議大家用 $變量=null 的方法來釋放其內(nèi)存。
給一個測試當(dāng)前php腳本內(nèi)存使用情況的函數(shù):
<?phpecho memory_get_usage()."\n";$a = str_repeat("A", 1000); echo memory_get_usage()."\n"; $b=&$a; //下面的內(nèi)存大小不會變,unset只是解除$a的綁定unset($a); echo memory_get_usage()."\n";?>