php 引用傳值學習筆記
來源:程序員人生 發布時間:2014-06-14 20:02:11 閱讀次數:4186次
在php中使用引用賦值只需要在原始對象前加個&就可以了,$a = &$b;其實php中的引用就是兩個不同名稱的變量指向同一個值。
引用是什么
在 PHP 中引用意味著用不同的名字訪問同一個變量內容。這并不像 C 的指針,替代的是,引用是符號表別名。注意在 PHP 中,變量名和變量內容是不一樣的,因此同樣的內容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——變量名是目錄條目,而變量內容則是文件本身。引用可以被看作是 Unix 文件系統中的 hardlink。
一:變量的引用,代碼如下:
- <?php
- $a =100;
- $b = &$a;
- echo $b;
- echo $a;
- $b= 200;
- echo $a;
- echo $b;
- ?>
二:函數中引用傳值,代碼如下:
- <?php
- function main($a,$b){
- $b= $a+100;
- return $b;
- }
- main(55,&$b);
- echo $b;
- ?>
三:對象的引用傳值,對象的引用,代碼如下:
- <?
- class club{
- var $name="real madrid";
- }
- $b=new club;
- $c=$b;
- echo $b->name;
- echo $c->name;
- $b->name="ronaldo";
- echo $c->name;
- ?>
取消引用:當你 unset 一個引用,只是斷開了變量名和變量內容之間的綁定,這并不意味著變量內容被銷毀了,例如如下代碼:
- <?php
- $a = 'ronaldo'
- $b =&$a;
- unset ($a);
- ?>
不會 unset $b,只是 $a,例,引用傳遞,test1.php,代碼如下:
- <?php
-
-
-
-
-
-
-
-
- function foo(&$var)
- {
- $var++;
- }
-
- $a=5;
-
- foo($a);
- foo(new stdClass());
-
- function bar()
- {
- $a = 5;
- return $a;
- }
- foo(bar());
- foo($a = 5)
- foo(5)
-
- ?>
test2.php,代碼如下:
- <?php
- function test(&$a)
- {
- $a=$a+100;
- }
- $b=1;
- echo $b;
- test($b);
-
- echo "<br>";
-
- echo $b;
-
-
-
-
-
-
-
-
-
- function a(&$b){
- $b++;
- }
- $c=0;
- call_user_func_array('a',array(&$c));
- echo $c;
-
- ?>
引用返回
引用返回用在當想用函數找到引用應該被綁定在哪一個變量上面時,不要用返回引用來增加性能,引擎足夠聰明來自己進行優化,僅在有合理的技術原因時才返回引用!要返回引用,使用此語法,代碼如下:
- <?php
- function &test()
- {
- static $b=0;
- $b=$b+1;
- echo $b;
- return $b;
- }
-
- $a=test();
- $a=5;
- $a=test();
-
- $a=&test();
- $a=5;
-
- $a=test();
- /**
- ?>
下面解釋下:
通過這種方式$a=test();得到的其實不是函數的引用返回,這跟普通的函數調用沒有區別,至于原因:這是PHP的規定
PHP規定通過$a=&test(); 方式得到的才是函數的引用返回
至于什么是引用返回呢(PHP手冊上說:引用返回用在當想用函數找到引用應該被綁定在哪一個變量上面時)這句狗屁話,害我半天沒看懂
用上面的例子來解釋就是:$a=test()方式調用函數,只是將函數的值賦給$a而已,而$a做任何改變 都不會影響到函數中的$b,而通過$a=&test()方式調用函數呢, 他的作用是將return $b中的$b變量的內存地址與$a變量的內存地址,指向了同一個地方,即產生了相當于這樣的效果($a=&$b;) 所以改變$a的值,也同時改變了$b的值,所以在執行了
$a=&test(); $a=5; 以后,$b的值變為了5
這里是為了讓大家理解函數的引用返回才使用靜態變量的,其實函數的引用返回多用在對象中.
在舉一個有意思的例子是在oschina上看到的,代碼如下:
- <?php
- $a = array('abe','ben','cam');
- foreach ($a as $k=>&$n)
- $n = strtoupper($n);
- foreach ($a as $k=>$n)
- echo "$nn";
- print_r($a);
- ?>
- will result in:
-
- ABE
- BEN
- BEN
- Array
- (
- [0] => ABE
- [1] => BEN
- [2] => BEN
- )
-
- Array
- (
- [0] => ABE
- [1] => BEN
- [2] => ABE
- )
- Array
- (
- [0] => ABE
- [1] => BEN
- [2] => BEN
- )
- Array
- (
- [0] => ABE
- [1] => BEN
- [2] => BEN
- )
因為沒有unset($n),所以它始終指向數組的最后一個元素,第二個foreach里第一次循環把$n,也就是$a[2]改成了ABE,第二次循環改成了BEN,第三次就也是BEN了。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈