【引用是什么】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();
【引用传参】函数
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