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 相关文章推荐
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
Jun 29 PHP
Thinkphp+smarty+uploadify实现无刷新上传
Jul 30 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
Sep 26 PHP
php实现基于openssl的加密解密方法
Sep 30 PHP
利用PHP判断是否是连乘数字串的方法示例
Jul 03 PHP
YII2框架中excel表格导出的方法详解
Jul 21 PHP
PHP使用Redis长连接的方法详解
Feb 12 PHP
PHP PDOStatement::fetchColumn讲解
Jan 31 PHP
PHP+Ajax简单get验证操作示例
Mar 02 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
May 27 PHP
Yii框架数据库查询、增加、删除操作示例
Oct 14 PHP
phpStorm2020 注册码
Sep 17 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 将bmp图片转为jpg等其他任意格式的图片
2009/06/21 PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
2011/09/23 PHP
yii实现CheckBox复选框在同一行显示的方法
2014/12/03 PHP
PHP中16个高危函数整理
2019/09/19 PHP
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
JavaScript 检测浏览器和操作系统的脚本
2008/12/26 Javascript
JQuery 写的个性导航菜单
2009/12/24 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
js数组方法扩展实现数组统计函数
2014/04/09 Javascript
介绍JavaScript中Math.abs()方法的使用
2015/06/14 Javascript
AngularJS初始化静态模板详解
2016/01/14 Javascript
jQuery实现的分子运动小球碰撞效果
2016/01/27 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
详解javascript表单的Ajax提交插件的使用
2016/12/29 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
2017/01/17 Javascript
easyui-datagrid开发实践(总结)
2017/08/02 Javascript
vue 标签属性数据绑定和拼接的实现方法
2018/05/17 Javascript
Node.js Buffer用法解读
2018/05/18 Javascript
Vue仿微信app页面跳转动画效果
2019/08/21 Javascript
python操作mongodb根据_id查询数据的实现方法
2015/05/20 Python
Python3实现并发检验代理池地址的方法
2016/09/18 Python
python中利用xml.dom模块解析xml的方法教程
2017/05/24 Python
python 实现敏感词过滤的方法
2019/01/21 Python
深入浅析Python 函数注解与匿名函数
2020/02/24 Python
Python3操作YAML文件格式方法解析
2020/04/10 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
HTML5 placeholder(空白提示)属性介绍
2013/08/07 HTML / CSS
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
使用索引(Index)有哪些需要考虑的因素
2016/10/19 面试题
2015年幼儿园毕业感言
2014/02/12 职场文书
开业庆典活动策划方案
2014/09/21 职场文书
2015年清明节网上祭英烈留言寄语
2015/03/04 职场文书
党员转正大会主持词
2015/07/02 职场文书
Python基础之进程详解
2021/05/21 Python