[PHP] PHP4中的引用

王朝php·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

引用是個很奇妙的東西,有點類似C中的指針,但是又不一樣!在PHP中,引用只是

變量內容的另外一個名字。下面我打幾個比方說明一下(只是PHP4的內容,PHP5中

關於類和對象的用法有很大的變化,還沒有仔細研究過):

1、 $a =& $b;

這裏創建了一個引用$a, 他指向變量名為$b的變量所指向的變量內容,羅嗦一點了

啊。打個比喻:就好比一個抽屜裏面有一個蛋糕,b有鑰匙,現在b復制了一把鑰匙

給a,a和b都可以打開這個抽屜,吃這個蛋糕。

2、將一個返回應用的操作綁定到一個變量:

$a =& new Someclass();

$a =& call_function();

new操作符返回Someclass的實例的拷貝,通過引用操作符,將這個拷貝綁

定到$a上,也就是說$a指向這個實例。如果是使用賦值操作符=,那麽將

復制這個實例,並且讓$a指向這個新復制的實例上。

3、引用傳遞

function Somefunction(&$a) {

$a += 10;

}

$a = 10;

Somefuntion($a);

// now $a is 20

通過這個方法,可以在函數範圍內操作函數範圍外的變量了。這個用法感

覺就和C裏面的指針比較類似。比如我寫一個打開文件的函數。

function opensomefile(&$fd) {

global $error;

$fd = @fopen("somefile");

if ($fd) {

return true;

} else {

$error = "can not open file";

return false;

}

}

然後就可以和c寫很相識的程序了:

// 初始化兩個變量

$fd = null;

$error = null;

if (opensomefile($fd)) {

// do something

} else {

exit($error);

}

註意,這裏只需要在定義函數的時候,在形參前面加上&符號,在調用這

個函數的地方就不需要了。這個和下面的引用返回不一樣!

4、引用返回

function &foo(){

// do something

$a =& new someclass();

return $a;

}

$refa =& foo();

這裏函數foo中創建了一個對象,$a 就是這個對象的引用,函數返回的是

這個引用。我們想在函數外部使用這個對象,就需要使用這樣的方法,

$refa =& foo(); 這一句話將函數foo返回的引用綁定到變量$refa上,也

就是說$refa和foo內部的$a指向同一個內容。

註意這裏在定義函數和調用函數的地方都要有&符號。

這種方法在使用Factory模式設計程序的時候經常用到,比如PEAR::DB庫

等等。

5、使用unset($var)來銷毀一個引用的時候,不會銷毀$var指向的內容:

$a = 10;

$b =& $a;

echo $a;

echo "\n";

echo $b;

echo "\n";

unset($b);

echo $a;

如上代碼,unset($b),並不會讓$a也產生變化。還是抽屜和鑰匙,a和b

都有同一個抽屜的鑰匙。b把鑰匙扔掉,但是a還有,還是可以打開抽屜。

6、我剛剛遇到的一個問題:

function foo(&$a) {

$a =& new someclass();

}

$aaa = null;

foo($aaa);

這樣的用法並不能讓$aaa指向someclass的一個實例。為什麽呢?因為在

調用foo的時候,形參$a是一個指向$aaa的引用,即$a =& $aaa;然後在函

數內部,$a又被重新指向另一個對象了。所以,並沒有操作$aaa。就像b

從a那裏得到開抽屜甲的鑰匙,但是不巧的是,他將這把鑰匙做成開抽屜

乙的了,那麽他自然不能再開抽屜甲咯。

 
 
 
免責聲明:本文為網絡用戶發布,其觀點僅代表作者個人觀點,與本站無關,本站僅提供信息存儲服務。文中陳述內容未經本站證實,其真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
© 2005- 王朝網路 版權所有 導航