免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2247 | 回复: 1
打印 上一主题 下一主题

php 引用传递、引用返回和取消引用以及unset [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-06 17:22 |只看该作者 |倒序浏览
php 引用传递、引用返回和取消引用以及unset





PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。

引用传递


Php代码
  1. 1.function foo ( &$var )   
  2. 2.{$var++;}   
  3. 3.foo ($a);  // 注意在函数调用时没有引用符号 - 只有函数定义中有。光是函数定义就足够使参数通过引用来正确传递了  
  4. function foo ( &$var )
  5. {$var++;}
  6. foo ($a);  
复制代码
// 注意在函数调用时没有引用符号 - 只有函数定义中有。光是函数定义就足够使参数通过引用来正确传递了  
引用返回


Php代码
  1. 1.function &init_users()   
  2. 2.{ ... return $cls;}   
  3. 3.//使用引用返回,必须在两个地方都用&符号   
  4. 4.$user = & init_users();   
  5. 5.function &init_users()   
  6. 6.{ ...return $cls;}  
  7. function &init_users()
  8. { ... return $cls;}
  9. //使用引用返回,必须在两个地方都用&符号
  10. $user = & init_users();
  11. function &init_users()
  12. { ...return $cls;}  
复制代码
取消引用
当 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。


Php代码
  1. 1.$a="hihaha";   
  2. 2.$b= &$a;   
  3. 3.unset($b);   
  4. 4.echo$a;// shows "hihaha"  
  5. $a="hihaha";
  6. $b= &$a;
  7. unset($b);
  8. echo$a;// shows "hihaha"  
复制代码
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

这里有个php引用的例子,好好看一遍:


Php代码
  1. 1.<?php   
  2. 2.//if you do:   
  3. 3.  
  4. 4.$a="hihaha";   
  5. 5.$b= &$a;   
  6. 6.$c="eita";   
  7. 7.$b=$c;   
  8. 8.echo$a;// shows "eita"   
  9. 9.  
  10. 10.$a="hihaha";   
  11. 11.$b= &$a;   
  12. 12.$c="eita";   
  13. 13.$b= &$c;   
  14. 14.echo$a;// shows "hihaha"   
  15. 15.  
  16. 16.$a="hihaha";   
  17. 17.$b= &$a;   
  18. 18.$b=null;   
  19. 19.echo$a;// shows nothing (both are set to null)   
  20. 20.  
  21. 21.$a="hihaha";   
  22. 22.$b= &$a;   
  23. 23.unset($b);   
  24. 24.echo$a;// shows "hihaha"   
  25. 25.  
  26. 26.$a="hihaha";   
  27. 27.$b= &$a;   
  28. 28.$c="eita";   
  29. 29.$a=$c;   
  30. 30.echo$b;// shows "eita"   
  31. 31.  
  32. 32.$a="hihaha";   
  33. 33.$b= &$a;   
  34. 34.$c="eita";   
  35. 35.$a= &$c;   
  36. 36.echo$b;// shows "hihaha"   
  37. 37.  
  38. 38.$a="hihaha";   
  39. 39.$b= &$a;   
  40. 40.$a=null;   
  41. 41.echo$b;// shows nothing (both are set to null)   
  42. 42.  
  43. 43.$a="hihaha";   
  44. 44.$b= &$a;   
  45. 45.unset($a);   
  46. 46.echo$b;// shows "hihaha"   
  47. 47.?>  
  48. <?php
  49. //if you do:

  50. $a="hihaha";
  51. $b= &$a;
  52. $c="eita";
  53. $b=$c;
  54. echo$a;// shows "eita"

  55. $a="hihaha";
  56. $b= &$a;
  57. $c="eita";
  58. $b= &$c;
  59. echo$a;// shows "hihaha"

  60. $a="hihaha";
  61. $b= &$a;
  62. $b=null;
  63. echo$a;// shows nothing (both are set to null)

  64. $a="hihaha";
  65. $b= &$a;
  66. unset($b);
  67. echo$a;// shows "hihaha"

  68. $a="hihaha";
  69. $b= &$a;
  70. $c="eita";
  71. $a=$c;
  72. echo$b;// shows "eita"

  73. $a="hihaha";
  74. $b= &$a;
  75. $c="eita";
  76. $a= &$c;
  77. echo$b;// shows "hihaha"

  78. $a="hihaha";
  79. $b= &$a;
  80. $a=null;
  81. echo$b;// shows nothing (both are set to null)

  82. $a="hihaha";
  83. $b= &$a;
  84. unset($a);
  85. echo$b;// shows "hihaha"
  86. ?>
  87. ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
复制代码
PHP unset全局变量在用户函数中只能销毁局部变量,并不能销毁全局变量。(从PHP4开始unset已经不再是一个函数了,而是一个语句)。如果需要销毁全局变量的应该如何做呢?也很简单,用$GLOBALS数组来实现。


Php代码
  1. 1.< ?PHP   
  2. 2.function foo() {   
  3. 3.unset($GLOBALS['bar']);  // 而不是unset($bar)   
  4. 4.}   
  5. 5.$bar = “something”;   
  6. 6.foo();   
  7. 7.var_dump($bar);   
  8. 8.?>  
  9. < ?PHP
  10. function foo() {
  11. unset($GLOBALS['bar']);  // 而不是unset($bar)
  12. }
  13. $bar = “something”;
  14. foo();
  15. var_dump($bar);
  16. ?>  
复制代码
对于unset:

1. 该函数只有在变量值所占空间超过256字节长的时候才会释放内存
2. 只有当指向该值的所有变量(比如有引用变量指向该值)都被销毁后,地址才会被释放(也要执行1的判断)
也就是检查有无其他变量绑定,有的话就不会释放了。就像这个例子:


Php代码
  1. 1.$a="hihaha";   
  2. 2.$b= &$a;   
  3. 3.unset($b);   
  4. 4.echo$a;// shows "hihaha"  
  5. $a="hihaha";
  6. $b= &$a;
  7. unset($b);
复制代码
echo$a;// shows "hihaha"  
所以建议大家用 $变量=null 的方法来释放其内存。

给一个测试当前php脚本内存使用情况的函数:


Php代码
  1. 1.<?php   
  2. 2.echo memory_get_usage()."\n";   
  3. 3.$a = str_repeat("A", 1000);   
  4. 4.echo memory_get_usage()."\n";   
  5. 5.$b=&$a;  //下面的内存大小不会变,unset只是解除$a的绑定   
  6. 6.unset($a);   
  7. 7.echo memory_get_usage()."\n";   
  8. 8.?>  
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-11-11 21:47 |只看该作者
谢谢撒
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP