PHP引用

【引用是什么】php

  PHP中的引用是用不一样的名字访问同一个变量内容。不一样与C的指针,PHP中的引用是zval标识符的别名。ide

 1 //对未定义的变量进行引用赋值、引用参数传递或引用返回时,将自动建立该变量
 2 function refTst(&$var){
 3     var_dump($var);
 4 }
 5 
 6 refTst($a);    //$a自动被建立并赋值为NULL
 7 
 8 refTst($ary['k']);
 9 var_dump(array_key_exists('k',$ary));    //bool(true)
10 
11 $obj=new StdClass();
12 refTst($obj->p);
13 var_dump(property_exists($obj,'p'));    //bool(true)
对未定义的变量进行引用赋值、引用参数传递或引用返回时,将自动建立该变量
 1 //函数内引用全局变量
 2 function globalRef(){
 3     global $var1,$var2;    //global $var是$var=&$GLOBALS['var']的简写
 4 
 5     $var2=$var1;
 6     echo $var2,$GLOBALS['var2'],PHP_EOL;    //11
 7     
 8     $var2=2;
 9     echo $var2,$GLOBALS['var2'],PHP_EOL;    //22
10 
11     $var2=&$var1;
12     echo $var2,$GLOBALS['var2'],PHP_EOL;    //12
13 
14     $var2=3;
15     echo $var2,$GLOBALS['var2'],PHP_EOL;    //32
16     echo $var1,$GLOBALS['var1'],PHP_EOL;    //33
17 }
18 
19 $var1=1;
20 $var2=0;
21 globalRef();
函数声明为global的变量则是对全局变量的引用

【引用传参】函数

 1 //引用传参
 2 function refTst(&$var){
 3     ++$var;
 4 }
 5 
 6 $var=1;
 7 refTst($var);    //若是写成refTst(&$var)将出现FATAL_ERROR。解决方法是设置php.ini中allow_call_time_pass_reference=true
 8 echo $var;    //2
 9   
10 call_user_func_array('refTst',array(&$var));    //第二个参数中必须加&,不然出现E_WARNING。call_user_func()中的参数不能是引用。
11 echo $var;    //3

【引用返回】this

 1 //引用返回
 2 function &refReturn{
 3     static $var=0;
 4     ++$var;
 5     return $var;
 6 }
 7 
 8 $v=refReturn()    //$v不是函数的引用返回,跟普通函数调用同样。$v和$val的值都是1
 9 $v=5;    //$var任然是1
10 $v=refRetrun()    //$v和$val的值都是2
11 
12 $v=&refReturn()    //引用返回的正确调用格式,$v是$var的引用。$v和$var都是3
13 $v=5;    //$v和$var都是5
14 $v=refReturn();    //$v和$var都是6
 1 class Talker{
 2     private $data='Hi';
 3     
 4     public function & get(){
 5         return $this->data;//不是return($this->data);
 6     }
 7 
 8     public function out(){
 9         echo $this->data;
10     }
11 }
12 
13 $obj=new Talker();
14 $dt=&$obj->get();
15 
16 $obj->out();
17 
18 $dt=' ,How';
19 $obj->out();
20 
21 $dt=' Are';
22 $obj->out;
23 
24 $dt=' You!';
25 $obj->out;
26 
27 //运行结果
28 Hi,How Are You!
引用返回的对象操做

 【对象的引用】spa

1 class Cls{
2     public $data='Obj Data';
3 }
4 
5 $obj=new Cls();
6 echo obj->data;    //Obj Data
7 $obj1=$obj;    //PHP5中对象赋值是个引用过程(PHP4中是个拷贝过程),PHP5默认以引用方式调用对象。若要创建对象副本,能够重写其__clone()方法;
8 $obj1->data='Obj1 Data';
9 echo $obj->data;    //Obj1 Data

【写时拷贝】指针

PHP中对地址的指向功能是由Zend核心实现的,PHP采用的是写时拷贝的原理,即:除非发生写操做,不然指向同一个地址的变量或对象是不会被拷贝的。code

 1 //写时拷贝
 2 $ary=array('a','b','c');
 3 $ary1=$ary;    //程序运行到这里,$ary和$ary1都指向同一块内存。
 4 
 5 function getAryCnt(&$ary){
 6     echo count($ary);
 7 }
 8 getAryCnt($ary);    //经过引用将$ary传递给getAryCnt()函数。此时,Zend引擎会认为getAryCnt()可能会改变$ary,因此此时将为$ary1从新申请一块内存单元并保存$ary的数据拷贝。这个过程就是“写时拷贝”。
 9 
10 //修改getAryCnt()
11 function getAryCnt($ary){
12     echo count($ary);
13 }
14 getAryCnt($ary);    //将getAryCnt()改成非引用传参时,不会改变$ary的值,因此没有出现写时拷贝。

【取消引用】对象

 1 //取消引用用unset()实现
 2 error_reptting(0);
 3 function refTst(){
 4     $var=&$GLOBALS['var'];    //等同于global $var;
 5     $var=5;
 6     unset($var);    //只是消除$var的引用,而对全局变量$GLOBALS['var']没影响
 7     var_dump($var);    //NULL
 8     echo $GLOBALS['var'];    //5
 9 }
10 
11 $var=1;
12 refTst();
13 echo $var;    //5
相关文章
相关标签/搜索