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 相关文章推荐
一个ORACLE分页程序,挺实用的.
Oct 09 PHP
linux环境apache多端口配置虚拟主机的方法深入介绍
Jun 09 PHP
YII路径的用法总结
Jul 09 PHP
CI框架Session.php源码分析
Nov 03 PHP
php验证session无效的解决方法
Nov 04 PHP
PHP中SimpleXML函数用法分析
Nov 26 PHP
ThinkPHP连接Oracle数据库
Apr 22 PHP
PHP快速排序quicksort实例详解
Sep 28 PHP
php版微信js-sdk支付接口类用法示例
Oct 12 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
Jun 15 PHP
php基于数组函数实现关联表的编辑操作示例
Jul 04 PHP
PHP析构函数destruct与垃圾回收机制的讲解
Mar 22 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 download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
php开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
详解PHP中curl_multi并发的实现
2020/06/08 PHP
js中的scroll和offset 使用比较的实例与分析
2013/09/29 Javascript
使用jquery animate创建平滑滚动效果(可以是到顶部、到底部或指定地方)
2014/05/27 Javascript
JavaScript学习笔记之基础语法
2015/01/22 Javascript
js仿土豆网带缩略图的焦点图片切换效果实现方法
2015/02/23 Javascript
理解javascript闭包
2015/12/15 Javascript
angularjs表格ng-table使用备忘录
2016/03/09 Javascript
快速掌握Node.js模块封装及使用
2016/03/21 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
2018/03/21 Javascript
async/await优雅的错误处理方法总结
2019/01/30 Javascript
通过vue手动封装on、emit、off的代码详解
2019/05/29 Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
2019/06/20 Javascript
Vue 实例事件简单示例
2019/09/19 Javascript
谈谈IntersectionObserver懒加载的具体使用
2019/10/15 Javascript
JS如何定义用字符串拼接的变量
2020/07/11 Javascript
[59:07]海涛为你详解DOTA2新版本“贤哲秘契”
2014/11/22 DOTA
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
[40:19]2018完美盛典CS.GO表演赛
2018/12/17 DOTA
[52:03]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第三场 1月31日
2021/03/11 DOTA
Python中apply函数的用法实例教程
2014/07/31 Python
利用python获取Ping结果示例代码
2017/07/06 Python
python实现对图片进行旋转,放缩,裁剪的功能
2019/08/07 Python
TensorFlow实现打印每一层的输出
2020/01/21 Python
python实现简单遗传算法
2020/09/18 Python
德国百年厨具品牌WMF美国站:WMF美国
2016/09/12 全球购物
销售经理岗位职责
2014/03/16 职场文书
学术会议主持词
2014/03/17 职场文书
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
团结演讲稿范文
2014/05/23 职场文书
2014年医院科室工作总结
2014/12/20 职场文书
2015年教师自我评价范文
2015/03/04 职场文书
教师自荐信范文
2015/03/06 职场文书
2016年度继续教育学习心得体会
2016/01/19 职场文书