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 相关文章推荐
Get或Post提交值的非法数据处理
Oct 09 PHP
改写函数实现PHP二维/三维数组转字符串
Sep 13 PHP
php sybase_fetch_array使用方法
Apr 15 PHP
php采用ajax数据提交post与post常见方法总结
Nov 10 PHP
PHP实现C#山寨ArrayList的方法
Jul 16 PHP
php实现计算百度地图坐标之间距离的方法
May 05 PHP
浅谈php fopen下载远程文件的函数
Nov 18 PHP
php自定义时间转换函数示例
Dec 07 PHP
PHP封装函数实现生成随机的字符串验证码
Jan 24 PHP
laravel 验证错误信息到 blade模板的方法
Sep 29 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
Apr 04 PHP
PHP基本语法
Mar 31 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
How do I change MySQL timezone?
2008/03/26 PHP
php file_get_contents函数轻松采集html数据
2010/04/22 PHP
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
php模拟登陆的实现方法分析
2015/01/09 PHP
PHP生成静态HTML页面最简单方法示例
2015/04/09 PHP
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
轻松实现jquery手风琴效果
2016/01/14 Javascript
html5+javascript实现简单上传的注意细节
2016/04/18 Javascript
js多功能分页组件layPage使用方法详解
2016/05/19 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
2017/01/09 Javascript
angular2路由之routerLinkActive指令【推荐】
2018/05/30 Javascript
vue-router 源码实现前端路由的两种方式
2018/07/02 Javascript
Vue实现表格批量审核功能实例代码
2019/05/28 Javascript
vue.js 2.0实现简单分页效果
2019/07/29 Javascript
[05:56]第十六期——新进3大C之小兔基
2014/06/24 DOTA
[01:00]选手抵达华西村 整装待发备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
python 循环while和for in简单实例
2016/08/16 Python
python OpenCV学习笔记直方图反向投影的实现
2018/02/07 Python
python安装教程
2018/02/28 Python
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
2018/12/19 Python
python中的print()输出
2019/04/12 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
pycharm sciview的图片另存为操作
2020/06/01 Python
什么是python的函数体
2020/06/19 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
python安装cx_Oracle和wxPython的方法
2020/09/14 Python
汇集了世界上最好的天然和有机美容产品:LoveLula
2018/02/05 全球购物
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
党员对照检查材料思想汇报(党的群众路线)
2014/09/24 职场文书
党支部先进事迹材料
2014/12/24 职场文书
道歉信怎么写
2015/05/12 职场文书
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python
小喇叭开始广播了! 四十多年前珍贵老照片
2022/05/09 无线电