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下10件你也许并不了解的事情
Sep 11 PHP
PHP可逆加密/解密函数分享
Sep 25 PHP
Session服务器配置指南与使用经验的深入解析
Jun 17 PHP
浅析linux下apache服务器的配置和管理
Aug 10 PHP
php实现数组筛选奇数和偶数示例
Apr 11 PHP
php中的动态调用实例分析
Jan 07 PHP
关于PHP开发的9条建议
Jul 27 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
Nov 23 PHP
php脚本运行时的超时机制详解
Feb 17 PHP
PHP创建word文档的方法(平台无关)
Mar 29 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
Apr 06 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实现时间轴函数代码
2011/10/08 PHP
php中global和$GLOBALS[]的分析之一
2012/02/02 PHP
php&amp;mysql 日期操作小记
2012/02/27 PHP
PHP按行读取文件时删除换行符的3种方法
2014/05/04 PHP
PHP文件上传类实例详解
2016/04/08 PHP
thinkPHP5.0框架应用请求生命周期分析
2017/03/25 PHP
代码分析jQuery四种静态方法使用
2015/07/23 Javascript
AngularJS基础 ng-keyup 指令简单示例
2016/08/02 Javascript
JS刷新父窗口的几种方式小结(推荐)
2016/11/09 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
关于vue-router路径计算问题
2017/05/10 Javascript
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
js学习总结_选项卡封装(实例讲解)
2017/07/13 Javascript
jQuery Collapse1.1.0折叠插件简单使用
2017/08/28 jQuery
浅谈react.js中实现tab吸顶效果的问题
2017/09/06 Javascript
JavaScript实现修改伪类样式
2017/11/27 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
JavaScript实现无限级递归树的示例代码
2019/03/29 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
简介JavaScript错误处理机制
2020/08/04 Javascript
python使用urllib模块开发的多线程豆瓣小站mp3下载器
2014/01/16 Python
python 处理telnet返回的More,以及get想要的那个参数方法
2019/02/14 Python
对Python中小整数对象池和大整数对象池的使用详解
2019/07/09 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
2020/06/03 Python
Python logging模块进行封装实现原理解析
2020/08/07 Python
皮尔·卡丹巴西官方商店:Pierre Cardin
2017/07/21 全球购物
华为的Java面试题
2014/03/07 面试题
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
公司年会搞笑主持词
2014/03/24 职场文书
单位考核聘任报告
2015/03/02 职场文书
在职人员跳槽求职信
2015/03/20 职场文书
药店收银员岗位职责
2015/04/07 职场文书
论文致谢词范文
2015/05/14 职场文书
毕业生自荐求职信书写的技巧
2019/08/26 职场文书
python可视化之颜色映射详解
2021/09/15 Python