最新公告
  • 欢迎您光临波比源码,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 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. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

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

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    波比源码
    一个高级程序员模板开发平台
    升级波友尊享更多特权立即升级