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.ini中文版(1)
Oct 09 PHP
不错的一篇面向对象的PHP开发模式(简写版)
Mar 15 PHP
phpMyAdmin 安装及问题总结
May 28 PHP
memcached 和 mysql 主从环境下php开发代码详解
May 16 PHP
PHP读取XML值的代码(推荐)
Jan 01 PHP
PHP版网站缓存加快打开速度的方法分享
Jun 03 PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
Jul 15 PHP
与文件上传有关的php配置参数总结
Jun 14 PHP
yii框架通过控制台命令创建定时任务示例
Apr 30 PHP
5款适合PHP使用的HTML编辑器推荐
Jul 03 PHP
php源码 fsockopen获取网页内容实例详解
Sep 24 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
Nov 20 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生成HTML静态页面实例代码
2008/08/31 PHP
Zend Framework校验器Zend_Validate用法详解
2016/12/09 PHP
如何用PHP做到页面注册审核
2017/03/02 PHP
jQuery的slideToggle方法实例
2013/05/07 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
常用js字符串判断方法整理
2013/10/18 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
2014/06/16 Javascript
JavaScript入门基础
2015/08/12 Javascript
JS实现可展开折叠层的鼠标拖曳效果
2015/10/09 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解
2016/04/11 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
2016/05/24 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
JavaScript &amp; jQuery完美判断图片是否加载完毕
2017/01/08 Javascript
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
Vue列表渲染的示例代码
2018/11/01 Javascript
vue 封装 Adminlte3组件的实现
2020/03/18 Javascript
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
Python基于matplotlib绘制栈式直方图的方法示例
2017/08/09 Python
解决python xlrd无法读取excel文件的问题
2018/12/25 Python
python实现dijkstra最短路由算法
2019/01/17 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
Python绘制二维曲线的日常应用详解
2019/12/04 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
Spark处理数据排序问题如何避免OOM
2020/05/21 Python
对Python 字典元素进行删除的方法
2020/07/31 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
如何利用Python动态模拟太阳系运转
2020/09/04 Python
Python使用for生成列表实现过程解析
2020/09/22 Python
HTML5 history新特性pushState、replaceState及两者的区别
2015/12/26 HTML / CSS
给排水工程师岗位职责
2013/11/21 职场文书
销售简历自我评价怎么写
2014/09/26 职场文书
企业党建工作总结2015
2015/05/26 职场文书
html5调用摄像头截图功能
2022/01/18 Javascript