当前位置:编程学习 > php >>

php引用(&)详解及注意事项

php的引用(就是在变量或者函数、对象等前面加上&符号)

在PHP 中引用的意思是:不同的名字访问同一个变量内容。
与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容,在内存中存放的地址。

1.变量的引用

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

<?
     $a = " ABC " ;
     $b   =& $a ;
     echo   $a ; // 这里输出:ABC
     echo   $b ; // 这里输出:ABC
     $b = " EFG " ;
     echo   $a ; // 这里$a的值变为EFG 所以输出EFG
     echo   $b ; // 这里输出EFG
?>

 


2.函数的引用传递(传址调用)


 

传址调用我就不多说了 下面直接给出代码

<? php
     function  test( & $a )
    {
         $a = $a + 100 ;
    }
     $b = 1 ;
     echo   $b ; // 输出1
    test( $b );    // 这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
     echo   " <br> " ;
     echo   $b ; // 输出101
?>
 

要注意的是,在这里test(1);的话就会出错,原因自己去想。

 

注意:

    上面的“ test($b); ” 中的$b前面不要加 & 符号,但是在函数“call_user_func_array”中,若要引用传参,就得需要 & 符号,如下代码所示:

 

<? php

function  a( & $b ){
     $b ++ ;
}
$c = 0 ;

call_user_func_array ( ' a ' , array ( & $c ));

echo   $c ;

// 输出 1

?>
 


3.函数的引用返回


 

先看代码

<? php
function   & test()
{
     static   $b = 0 ; // 申明一个静态变量
     $b = $b + 1 ;
     echo   $b ;
     return   $b ;
}

$a = test(); // 这条语句会输出 $b的值 为1
$a = 5 ;
$a = test(); // 这条语句会输出 $b的值 为2

$a =& test(); // 这条语句会输出 $b的值 为3
$a = 5 ;
$a = test(); // 这条语句会输出 $b的值 为6
?>
 

下面解释下:
通过这种方式$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

这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中


另附一个php官方例子:

This is the way how we  use  pointer to access variable inside the  class .

<? php
class  talker{

     private   $data   =   ' Hi ' ;

     public   function   &  get(){
         return   $this -> data;
    }
  
     public   function  out(){
         echo   $this -> data;
    }  

}

$aa   =   new  talker();
$d   =   & $aa -> get();

$aa -> out();
$d   =   ' How ' ;
$aa -> out();
$d   =   ' Are ' ;
$aa -> out();
$d   =   ' You ' ;
$aa -> out();
?>

the output is  " HiHowAreYou "

 

 

4.对象的引用


 

<? php
     class  a{
         var   $abc = " ABC " ;
    }
     $b = new  a;
     $c = $b ;
     echo   $b -> abc; // 这里输出ABC
     echo   $c -> abc; // 这里输出ABC
     $b -> abc = " DEF " ;
     echo   $c -> abc; // 这里输出DEF
?>

以上代码是在PHP5中的运行效果

 

在PHP5中 对象的赋值是个引用的过程。上列中$b=new a; $c=$b; 其实等效于$b=new a; $c=&$b;
PHP5中默认就是通过引用来调用对象, 但有时你可能想建立一个对象的副本,并希望原来的对象的改变不影响到副本 . 为了这样的目的,PHP5定义了一个特殊的方法,称为__clone。

自 PHP 5 起,new 自动返回引用,因此在此使用 =& 已经过时了并且会产生 E_STRICT 级别的消息。
 

 

在php4中,对象的赋值是个拷贝过程,

如:$b=new a,其中new a产生的是一个匿名的a对象实例,而此时的$b是对这个匿名对象的拷贝。同理$c=$b,也是对$b内容的一个拷贝。所以在php4中,为了节省内存空间,$b=new a 一般会改成引用的模式,即 $b=& new a。

 

下面再来个 官方 提供的例子:

 在php5中,你不需要额外添加什么东西就可到达“对象引用”的功能:

 

<? php
class  foo{
         protected   $name ;
         function  __construct( $str ){
                 $this -> name  =   $str ;
        }
         function  __toString(){
                 return    ' my name is " ' .   $this -> name  . ' " and I live in " '   .   __CLASS__   .   ' ". '   .   " \n " ;
        }
         function  setName( $str ){
                 $this -> name  =   $str ;
        }
}

class  MasterOne{
         protected   $foo ;
         function  __construct( $f ){
                 $this -> foo  =   $f ;
        }
         function  __toString(){
                 return   ' Master

补充:Web开发 , php ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,