PHP引用符&的用法详细解析


Posted in PHP onAugust 22, 2013

关于php的引用(就是在变量或者函数、对象等前面加上&符号)的作用,我们先看下面这个程序。

<?php  
 $a = 100; //声明变量a  
 $b = &$a; //声明变量b,引用自变量a  
 echo "$a <br />";    
 echo "$b <br />";  
 $a++; //变量a自增1  
 echo "$a <br />";  
 echo "$b <br />";//查看变量b,也增加了1,说明使用的是同一存储单元  
 ?>

程序运行结果:
100   
100   
101   
101

很多人误解php中的引用跟C当中的指针一样,事实上并非如此,而且很大差别。C语言中的指针除了在数组传递过程中不用显式申明外,其他都需要使用*进行定义,而php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。

php默认为传值传递:

<?php      
 $a = 20;  
 $b = $a;  
 $a = $a + 10;   
 echo $a.' and '.$b;   
 ?>

程序运行结果:
30 and 20

要是想变为地址传递需要加&,既:
<?php  
 $a = 20;  
 $b = &$a;   
 $a = $a + 10;   
 echo $a.' and '.$b;   
 ?>

程序运行结果:
30 and 30

也就是说,&把$a的地址传给了$b,这样的话这两个变量现在共享一个内存的存储区域,就是说它们的值是一样的。

同样的语法可以用在函数中,它返回引用,以及用在 new 运算符中:

 <?php  
 $bar =& new fooclass();  
 $foo =& find_var($bar);  
 ?>

引用做的第二件事是用引用传递变量。这是通过在函数内建立一个本地变量,并且该变量在呼叫范围内引用了同一个内容来实现的。说的通俗点就是一个函数的参数是一个本地变量的引用。下面再举例说明一下:
 <?php  
 function foo(&$val1, $val2) {  
     $val1 += 1;  
     $val2 += 1;  
 }  
 $a=5;  
 $b=10;  
 foo($a,$b);  
 echo $a;  
 echo $b;  
 ?>

运行这段代码是给函数传递两个参数,一个是引用$a的内容,一个是$b的值,在执行此函数后,发现$a的内容改变了,而$b的内容则没有变化。

PHP引用的第三个用法是引用返回,这个用法理解起来有点难度,引用返回用在当你想用函数找到引用应该被绑定在哪一个变量上面时。当返回引用时,使用此语法:说的简单点,就还是引用函数的返回。但和参数传递不同,必须在函数定义和函数引用这两个地方都用 & 符号。下面举个例子:

 <?php  
 function &find_var ($param)  
 {  
     /* ...code... */ 
     return $found_var;  
 }  
 $foo =& find_var ($bar);  
 $foo->x = 2;  
 ?>

这个例子给$foo 赋值是函数find_var的返回引用,所以在给$foo->x赋值时就是给find_var的返回引用赋值,而不是简单的赋值。

PHP引用的最后一个用法是引用定位,主要有两个应用:一个是global 引用,当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是和$var =& $GLOBALS["var"];是一样的。另外一个是$this的用法,在一个对象的方法中,$this 永远是调用它的对象的引用。

PHP 相关文章推荐
PHP常用函数小技巧
Sep 11 PHP
火车头discuz6.1 完美采集的php接口文件
Sep 13 PHP
Uncaught exception com_exception with message Failed to create COM object
Jan 11 PHP
windows环境下php配置memcache的具体操作步骤
Jun 09 PHP
php实现将任意进制数转换成10进制的方法
Apr 17 PHP
php实现求相对时间函数
Jun 15 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
Jul 31 PHP
Zend Framework教程之Zend_Config_Xml用法分析
Mar 23 PHP
PHP单例模式是什么 php实现单例模式的方法
May 14 PHP
PHP中Cookie的使用详解(简单易懂)
Apr 28 PHP
PHP连接MySQL数据库并以json格式输出
May 21 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
Oct 21 PHP
新手菜鸟必读:session与cookie的区别
Aug 22 #PHP
PHP mysql与mysqli事务使用说明 分享
Aug 17 #PHP
php中url传递中文字符,特殊危险字符的解决方法
Aug 17 #PHP
测试PHP连接MYSQL成功与否的代码
Aug 16 #PHP
PHP 通过Socket收发十六进制数据的实现代码
Aug 16 #PHP
php读取mysql中文数据出现乱码的解决方法
Aug 16 #PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
Aug 16 #PHP
You might like
php 正则表达式小结
2009/08/31 PHP
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
2009/09/30 PHP
PHP memcache在微信公众平台的应用方法示例
2017/09/13 PHP
formStorage 基于jquery的一个插件(存储表单中元素的状态到本地)
2012/01/20 Javascript
js中的getAttribute方法使用示例
2014/08/01 Javascript
解决微信内置浏览器返回上一页强制刷新问题方法
2017/02/05 Javascript
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
bootstrap表格内容过长时用省略号表示的解决方法
2017/11/21 Javascript
关于HTML5的data-*自定义属性的总结
2018/05/05 Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
2018/11/13 Javascript
实例讲解JavaScript 计时事件
2020/07/04 Javascript
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
Python之reload流程实例代码解析
2018/01/29 Python
致Python初学者 Anaconda入门使用指南完整版
2018/04/05 Python
PyCharm搭建Spark开发环境的实现步骤
2019/09/05 Python
Pytorch之finetune使用详解
2020/01/18 Python
Python使用os.listdir和os.walk获取文件路径
2020/05/21 Python
css3 中translate和transition的使用方法
2020/03/26 HTML / CSS
HTML5表格_动力节点Java学院整理
2017/07/11 HTML / CSS
日本最大美瞳直送网:Morecontact(中文)
2019/04/03 全球购物
心碎乌托邦的创业计划书范文
2013/12/26 职场文书
给医务人员表扬信
2014/01/12 职场文书
创先争优制度
2014/01/21 职场文书
大学毕业自我鉴定范文
2014/02/03 职场文书
迟到早退检讨书
2014/02/10 职场文书
酒店总经理职务说明书
2014/02/26 职场文书
学生鉴定评语大全
2014/05/05 职场文书
研究生求职自荐书
2014/06/23 职场文书
医院党员公开承诺书
2014/08/30 职场文书
财会专业大学生求职信
2014/09/26 职场文书
2014年小学工作总结
2014/11/26 职场文书
酒店工程部主管岗位职责
2015/04/16 职场文书
刑事申诉状范文
2015/05/20 职场文书
实用干货:敬酒词大全,帮你应付各种场合
2019/11/21 职场文书