php的引用符号&用法

  1. <?php
  2. $a='CC';
  3. $b=$a;//$a和$b指向同一内存地址
  4. $a='DD';
  5. echo $b;
  6. /*
  7. php中对于地址的指向(类似指针)功能不是由用户自己来实现的,
  8. 是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,
  9. 就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。
  10. 当$a='DD';
  11. 由于$a与$b所指向的内存的数据要重新写一次了,此时Zend核心会自动判断
  12. 自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储。
  13. * */
  14. echo '<hr>';
  15. $c='ABC';
  16. $d=&$c;//$b指向$a的内存地址,传地址赋值
  17. $d='E';
  18. echo $c;
  19. /**
  20. CC
  21. --------------------------------------------------------------------------------
  22. E
  23. * */
  24. ?>
  25. <?php
  26. //函数的引用返回
  27. function &test()
  28. {
  29. static $b=0;//申明一个静态变量
  30. $b=$b+1;
  31. echo '$b='.$b;
  32. echo '<br>';
  33. return $b;
  34. }
  35. $a=test();
  36. echo '$a='.$a;//这里不是函数的引用返回,跟普通的函数调用没有区别
  37. $a=&test(); //这种方式才是函数的引用返回。
  38. //至于什么是引用返回呢(PHP手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。)
  39. //用在这里意思就是test()被绑定在$a上了。
  40. echo '$a='.$a;
  41. $a=6;
  42. test();//这条语句会输出$b的值 为7
  43. echo '$a='.$a;
  44. /*
  45. $b=1
  46. $a=1$b=2
  47. $a=2$b=7
  48. $a=7
  49. * */
  50. ?>
  51. <?php
  52. //引用传递
  53. function printArray(&$arr){
  54. //echo count($arr);
  55. array_pop($arr);
  56. echo count($arr);
  57. }
  58. //值传递
  59. function printArray2($arr){
  60. //echo count($arr);
  61. array_pop($arr);
  62. echo count($arr);
  63. }
  64. $a=array(1,2,3);
  65. $b=$a;
  66. //$b=&$a;
  67. printArray($a);
  68. print_r($b);
  69. print_r($a);
  70. echo '<hr>';
  71. printArray($a);
  72. print_r($b);
  73. print_r($a);
  74. /**
  75. 2Array ( [0] => 1 [1] => 2 [2] => 3 ) Array ( [0] => 1 [1] => 2 )
  76. --------------------------------------------------------------------------------
  77. 1Array ( [0] => 1 [1] => 2 [2] => 3 ) Array ( [0] => 1 )
  78. * */
  79. ?>
  80. <?php
  81. //对象的引用
  82. class a{
  83. var $name="ABC";
  84. }
  85. $b=new a;
  86. $c=$b;
  87. echo '$b->name='.$b->name;//这里输出ABC
  88. echo '<br>';
  89. echo '$c->name='.$c->name;//这里输出ABC
  90. echo '<br>';
  91. $b->name="DEF";
  92. echo '$b->name='.$b->name;
  93. echo '<br>';
  94. echo '$c->name='.$c->name;
  95. echo '<hr>';
  96. /*
  97. 在PHP5中 对象的复制 是通过引用来实现的。
  98. 上列中$b=new a; $c=$b; 其实等效于$b=new a; $c=&$b;
  99. PHP5中默认就是通过引用来调用对象,
  100. 但有时你可能想建立一个对象的副本,
  101. 并希望原来的对象的改变不影响到副本 .
  102. 为了这样的目的,PHP定义了一个特殊的方法,称为__clone.
  103. * */
  104. $x=new a;
  105. $y=clone $x;
  106. $x->name='XXX';
  107. echo '$x->name='.$x->name;
  108. echo '<br>';
  109. echo '$y->name='.$y->name;
  110. /*
  111. $b->name=ABC
  112. $c->name=ABC
  113. $b->name=DEF
  114. $c->name=DEF
  115. --------------------------------------------------------------------------------
  116. $x->name=XXX
  117. $y->name=ABC
  118. * */
  119. ?>