程序员人生 网站导航

php 引用传值学习笔记

栏目:php教程时间:2014-06-14 20:02:11

在php中使用引用赋值只需要在原始对象前加个&就可以了,$a = &$b;其实php中的引用就是两个不同名称的变量指向同一个值。

引用是什么

在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的 hardlink。

一:变量的引用,代码如下:

  1. <?php 
  2. $a =100; 
  3. $b = &$a
  4. echo $b;    //这里输出100 
  5. echo $a;    //这里输出100  ,说明$a,和$b的值都是一百。 
  6. $b= 200; 
  7. echo $a;    //这里输出200 
  8. echo $b;    //这里输出200,这就可以看出他们用的是同一个地址。改变一个,另一个也会跟着改变。 
  9. ?> 

二:函数中引用传值,代码如下:

  1. <?php 
  2. function main($a,$b){ 
  3.     $b$a+100; 
  4.     return $b
  5. main(55,&$b); //这里的$b其实就是把它的内存地址传递给函数main中的$b参数,通过参数$b的改变而改变外面的$b的值。 
  6. echo $b;  //这里会输出155, 
  7. ?> 

三:对象的引用传值,对象的引用,代码如下:

  1. <? 
  2. class club{ 
  3. var $name="real madrid"
  4. $b=new club; 
  5. $c=$b
  6. echo $b->name;//这里输出real madrid 
  7. echo $c->name;//这里输出real madrid 
  8. $b->name="ronaldo"
  9. echo $c->name;//这里输出ronaldo 
  10. ?> 

取消引用:当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定,这并不意味着变量内容被销毁了,例如如下代码:

  1. <?php 
  2. $a = 'ronaldo' 
  3. $b =&$a
  4. unset ($a); 
  5. ?> 

不会 unset $b,只是 $a,例,引用传递,test1.php,代码如下:

  1. <?php  
  2. /**  
  3. *   引用传递  
  4.     以下内容可以通过引用传递:  
  5.     变量,例如 foo($a)  
  6.     New 语句,例如 foo(new foobar())  
  7.     从函数中返回的引用,例如:  
  8.    
  9. */ 
  10.     function foo(&$var)  
  11.     {  
  12.         $var++;  
  13.     }  
  14.    
  15.     $a=5;  
  16.     //合法  
  17.     foo($a);  
  18.     foo(new stdClass());  
  19.     //非法使用  
  20.     function bar() // Note the missing &  
  21.     {  
  22.        $a = 5;  
  23.        return $a;  
  24.     }  
  25.     foo(bar()); // 自 PHP 5.0.5 起导致致命错误  
  26.     foo($a = 5) // 表达式,不是变量  
  27.     foo(5) // 导致致命错误  
  28.    
  29. ?> 

test2.php,代码如下:

  1. <?php  
  2. function test(&$a)  
  3. {  
  4. $a=$a+100;  
  5. }  
  6. $b=1;  
  7. echo $b;//输出1  
  8. test($b);   //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了  
  9.    
  10. echo "<br>";  
  11.    
  12. echo $b;//输出101  
  13.    
  14. /*****************************  
  15.  
  16. * 这里需要注意 call_user_func_array 后的参数是需要 &  
  17.  
  18. * ****************************/ 
  19.    
  20.     //上面的“ test($b); ” 中的$b前面不要加 & 符号,但是在函数“call_user_func_array”中,若要引用传参,就得需要 & 符号,如下代码所示:  
  21.    
  22.     function a(&$b){  
  23.         $b++;  
  24.     }  
  25.     $c=0;  
  26.     call_user_func_array('a',array(&$c));  
  27.     echo $c;  
  28. //输出 1  
  29. ?> 

引用返回

引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时,不要用返回引用来增加性能,引擎足够聪明来自己进行优化,仅在有合理的技术原因时才返回引用!要返回引用,使用此语法,代码如下:

  1. <?php  
  2. function &test()  
  3. {  
  4. static $b=0;//申明一个静态变量  
  5. $b=$b+1;  
  6. echo $b;  
  7. return $b;  
  8. }  
  9.    
  10.     $a=test();//这条语句会输出 $b的值 为1  
  11.     $a=5;  
  12.     $a=test();//这条语句会输出 $b的值 为2  
  13.    
  14.     $a=&test();//这条语句会输出 $b的值 为3  这里将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方  
  15.     $a=5;  //已经改变了 return $b中的 $b变量的值  
  16.    
  17.     $a=test();//这条语句会输出 $b的值 为6  
  18. /**  
  19. ?> 

下面解释下:

通过这种方式$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上看到的,代码如下:

  1. <?php  
  2. $a = array('abe','ben','cam');  
  3. foreach ($a as $k=>&$n)  
  4.     $n = strtoupper($n);  
  5. foreach ($a as $k=>$n// notice NO reference here!  
  6.     echo "$nn";  
  7. print_r($a);  
  8. ?> 
  9. will result in: 
  10.  
  11. ABE 
  12. BEN 
  13. BEN 
  14. Array 
  15.     [0] => ABE 
  16.     [1] => BEN 
  17.     [2] => BEN 
  18. //解释: 在第二个foreach中循环如下: 
  19. Array 
  20. [0] => ABE 
  21. [1] => BEN 
  22. [2] => ABE 
  23. Array 
  24. [0] => ABE 
  25. [1] => BEN 
  26. [2] => BEN 
  27. Array 
  28. [0] => ABE 
  29. [1] => BEN 
  30. [2] => BEN 

因为没有unset($n),所以它始终指向数组的最后一个元素,第二个foreach里第一次循环把$n,也就是$a[2]改成了ABE,第二次循环改成了BEN,第三次就也是BEN了。

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐