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 相关文章推荐
多重?l件?合查?(二)
Oct 09 PHP
php下载远程文件类(支持断点续传)
Nov 14 PHP
php重定向的三种方法分享
Feb 22 PHP
解析PHP正则提取或替换img标记属性
Jun 26 PHP
php Calender(日历)代码分享
Jan 03 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
Jan 03 PHP
PHP实现的DES加密解密实例代码
Apr 06 PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
Aug 11 PHP
PHP自动生成缩略图函数的源码示例
Mar 18 PHP
PHP保留两位小数的几种方法
Jul 24 PHP
Yii框架实现对数据库的CURD操作示例
Sep 03 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
Mar 09 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
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
某人初学javascript的时候写的学习笔记
2010/12/30 Javascript
JQuery中$之选择器用法介绍
2011/04/05 Javascript
使用js 设置url参数
2013/07/08 Javascript
js实现的简单radio背景颜色选择器代码
2015/08/18 Javascript
javascript中Date format(js日期格式化)方法小结
2015/12/17 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
2016/11/22 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
vue二级菜单导航点击选中事件的方法
2018/09/12 Javascript
仿vue-cli搭建属于自己的脚手架的方法步骤
2019/04/17 Javascript
[01:12:53]完美世界DOTA2联赛PWL S2 Forest vs SZ 第一场 11.25
2020/11/26 DOTA
网站渗透常用Python小脚本查询同ip网站
2017/05/08 Python
Python对多属性的重复数据去重实例
2018/04/18 Python
对numpy中的where方法嵌套使用详解
2018/10/31 Python
django admin.py 外键,反向查询的实例
2019/07/26 Python
django中上传图片分页三级联动效果的实现代码
2019/08/30 Python
torch 中各种图像格式转换的实现方法
2019/12/26 Python
在Python中字典按值排序的实现方法
2020/11/12 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
python 实现图片批量压缩的示例
2020/12/18 Python
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
夏尔巴人登珠峰品牌:Sherpa Adventure Gear
2018/02/08 全球购物
写出二分查找算法的两种实现
2013/05/13 面试题
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
2016/04/15 面试题
怎样写好自荐信和推荐信
2013/12/26 职场文书
上课迟到检讨书
2014/01/19 职场文书
生物制药自我鉴定
2014/01/25 职场文书
党的群众路线教育实践活动查摆问题及整改措施
2014/10/10 职场文书
2016大学军训心得体会
2016/01/11 职场文书
Python如何使用logging为Flask增加logid
2021/03/30 Python
如何用python插入独创性声明
2021/03/31 Python
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android