php中&的使用

来源:互联网 发布:凯立德v7端口修改工具 编辑:程序博客网 时间:2024/06/08 06:52

引用传递:

通常在函数的参数列表里的参数是传值传递,如:function   count($a){ $a++; }  将变量$a拷贝一下,然后将拷贝后的复制品传递给count函数,然后进行自加,因为传进去的只是一个复制品,不管这个复制品怎么改变,我真正的$a是不受影响的。但是如果改成  function   count(&$a){  $a++   }, 那么这时是将$a的本身的内存地址传进去,那可是机密啊,地址都给人家了知道了,它一改动,你就得发生变化了。

 

**注意**-------  

$a = 3;                                          //在函数调用时没有引用符号 ,只有函数定义中有.
function countnum(&$b) {        //必须定义函数参数是接受变量引用的。如果参数列表写成$b,但是下面调用的
 $b++;    //用$b,无须用&$b       //时候往里面传的是应用也会报错。所以应该是函数定义接受变量引用,调用
                                                   //的时候传入变量即可,无需传入变量的引用。
countnum($a);           //直接将$a传进去即可,无需写成  &$a
echo $a;                    

 

引用返回:

  1. function &test()  
  2.  
  3. static $b=0;//申明一个静态变量  
  4. $b=$b+1;  
  5. echo $b 
  6. return $b 
  7.  
  8.   
  9. $a=test();//这条语句会输出 $b的值 为1  
  10. $a=5;  
  11. $a=test();//这条语句会输出 $b的值 为2  
  12. $a=&test();//这条语句会输出 $b的值 为3  
  13. $a=5;  
  14. $a=test();//这条语句会输出 $b的值 为6  

在 里面如果用到的是$a = test();  那其实和普通的传值调用一样,return 的是$b的拷贝值给$a,如果使用的是

$a = &test();  那么return 的是$b的引用给$a,则相当于是:$a =&$b; 这意味着 $a 和 $b 指向了同一个变量。它们共享一个值,不管是$a变化,还是$b变化,他们共同指向的值都会发生改变。

注: $a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方.

PHP 的引用允许你用两个变量来指向同一个内容。

 

$a=test()方式调用函数,只是将函数的值赋给$a而已, 而$a做任何改变 都不会影响到函数中的$b.
而通过$a=&test()方式调用函数呢, 他的作用是将return $b中的 $b变量的内存地址与$a变量的内存地址,
指向了同一个地方. 即产生了相当于这样的效果($a=&$b; $a和$b指向了同一个地方) 所以改变$a的值,也同时改变了$b 的值 ,所以在执行了:
$a=&test();  $a=5; 以后,$b的值变为了5

 

再一个例子:

  1. function &abc(&$a){     //函数作用:接收变量引用,函数主体里的代码可以直接改变变量的值,而且在 6. 里将修改
  2.     $a "def"           //完值后的变量$c的引用附给了$b
  3.     return $a 
  4.  
  5. $c "abc"//赋值"abc"  
  6. $b &abc($c);  //参数是传址方式,$a也指向$c指向的字串, 所以函数内部$c被赋值成"def" ,按传址方式返回给$b, 所以$b也指向这个字串.  
  7. echo $b   //输出"def".  
  8. $b "abc"//把$b赋值为"abc"(目的是检测$c是否变化).  
  9. echo $c   //输出"abc".  

函数返回值此时不能是地址, PHP的语法不允许return后面跟&$var的方式, 就写return $var就可以了.



-----------数组中&的应用-----------

另一个例子:

如有一个数组 要进行排序,现在把它传到一个排序函数里面进行排序:


function sortarr(&$arr) {
$len = count($arr);

for ($i = 0; $i < $len; $i++) {         //从左开始往右。大的往右挪。
for ($j = 0; $j < $len-$i-1; $j++) {
if ($arr[$j] > $arr[$j+1]) {
$ano = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $ano;
}
}
}

}


$arr = array(1, 23, 2, 15, 99, 16, 99999, 45, 100, 25, 6, 322, 555);
sortarr($arr);
foreach ($arr as $value) {
echo $value.'     ';
}


在定义排序函数的时候如果参数列表是$arr的话,那么数组是传值传递,即在函数里面拷贝了一个一模一样的数组,所以在函数里面做出的排序改变的仅仅是拷贝值,那么在调用完函数后在输出的话,数组顺序仍然没有改变。

如果参数列表时&$arr的话,那么数组就是传递的是数组的地址,那么在函数里面做出的任何对数组的改变都会影响到那个数组,在调用完函数后在输出的话可以发现数组顺序发生了改变。

0 0
原创粉丝点击