文章來源
http://www.php5.idv.tw/bb-1646.htm
作 者: sparkler
==============================================================================
//在 PHP 5 裡面,
//運算元若為物件, =號後面運算式 若有& 代表位置相同, 而不是拷貝結構
//記憶體實際上只有一份
//而且 PHP 5 即使是透過 function 傳遞, 只要變數是物件 不論有無加 &
//都是傳址呼叫
class PObject{
var $i;
}
$lpObject1 = new PObject();
$lpObject1->i = 123;
$lpObject2 = $lpObject1;
echo $lpObject2->i.'<br/>’; //出現 123
$lpObject3 = &$lpObject1;
echo $lpObject3->i.'<br/>’; //出現 123
unset($lpObject1);
echo $lpObject2->i.'<br/>’; //出現 123
echo $lpObject3->i.'<br/>’; //出現 123
$lpObject2->i = 1234;
echo $lpObject3->i.'<br/>’; //出現 1234 不管是不是用 & 生成的變數
// PHP 5 即使是透過 function 傳遞, 只要變數是物件 不論有無加 &
//都是傳址呼叫
function foo1($m){
echo $m->i.'<br/>’; ; //出現 1234
$m->i = 456;
}
foo1($lpObject2);
echo $lpObject2->i.'<br/>’; //出現 456
function foo2(&$n){
echo $n->i.'<br/>’; //出現 456, 因為 $lpObject3 和 $lpObject2 是同一個記憶體
$n->i = 789;
}
foo2($lpObject3);
echo $lpObject3->i.'<br/>’; //出現 789
echo $lpObject2->i.'<br/>’; //出現 789 因為 $lpObject3 和 $lpObject2 是同一個記憶體
//PHP5 若有多個物件變數指向同一份記憶體
//則當所有指向同一份記憶體的變數全部都 unset 才會真正清除該記憶體
unset($lpObject2);
echo $lpObject3->i.'<br/>’; //$lpObject2 和 $lpObject3 相同記憶體, unset $lpObject2 後仍然出現 789
//但是當變數用來存放非物件 比如說整數,
則 function 裡面有 &$i 表示傳址, 不加 & 表示傳值
等號表示拷貝記憶體變成不同的兩塊
就是說單純型別時 =& $i 和 = $i 意義不同
就是說物件型別時 =& $i 和 = $i 意義相同
?>
^_^ 小心用囉, 包括 unset 和 =號 和 &
意義都和 PHP4 不同
==============================================================================
//function(參數…) 參數宣告沒有加 & 表示傳值呼叫
//則宣告的參數將會生成於 function 的開始符號 {
//摧毀於 結束符號 }
//就是說 function 內宣告的參數和呼叫來源傳入的參數 是不同的記憶體
//變數生命週期於 function
function foo($input,$y){
$input = ‘aaa’;
$y = ‘bbb’;
}
$x = 123;
$y = 456;
foo($x,$y);
echo $x; //出現 123
echo $y; //出現 456
//在 function 的宣告式 將參數加上 & 符號, 表示傳址呼叫
//不論傳入前的名稱 是否和宣告的參數名稱是否相同 都會按照順序配對記憶體相同
//如下 $x 和 function 裡面的 $input 的記憶體相同
// $y 和 function 裡面的 $y 的記憶體相同
//既然記憶體相同 那麼 function 裡面的變數一但變更 所有對應的相同的記憶體的變數 echo 結果當然一樣
function foo2(&$input,&$y,$qoo){
echo $input;
echo $y;
echo $qoo;
$input = ‘aaa’;
$y = ‘bbb’;
$qoo = ‘3388’; //function 結束標記 } 時摧毀 $qoo
//…
//…
}
$x = 123;
$y = 456;
$zoo = ‘2266’;
foo2($x,$y,$zoo);
echo $x; //出現 aaa
echo $y; //出現 bbb
echo $zoo; //出現 2266
// PHP 不支援指標運算, 所以 & 在等號之後不能進行運算式
$input1 = 1;
$input1 = &$input1; //可以這樣寫 奇怪的寫法 對 C++ 而言是指標, 但 沒什意義等同 $input1 = $input1; //執行期解譯不會錯誤
//echo *$input; ///錯 不能這樣寫, PHP 不支援 * 用法, echo *$input 這是 C++ 的用法
echo $input1;
$input2 = &$input1; //可以這樣寫 表示兩個變數是同一個記憶體
echo $input2;
//$input = &$input + 1; //可以這樣寫 不會發生執行期解譯錯誤, 但是等同 $input = $input
//$input = (&$input + 1); //錯 不能這樣寫 發生執行期解譯錯誤
//$input = &($input + 1); //錯 不能這樣寫 發生執行期解譯錯誤
//$input2 = (&$input) + 1; //錯 不能這樣寫 發生執行期解譯錯誤