php 引用传值学习笔记

在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了。

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 本站源码并不保证全部能正常使用,仅供有技术基础的人学习研究,请谨慎下载
8. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » php 引用传值学习笔记

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡