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中数据的批量导入(csv文件)
Oct 09 PHP
Discuz 6.0+ 批量注册用户名
Sep 13 PHP
php面向对象全攻略 (十七) 自动加载类
Sep 30 PHP
Windows7下的php环境配置教程
Feb 28 PHP
PHP中is_file()函数使用指南
May 08 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
Sep 14 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
Dec 21 PHP
Yii2验证器(Validator)用法分析
Jul 23 PHP
php根据年月获取当月天数及日期数组的方法
Nov 30 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
Oct 22 PHP
浅谈php://filter的妙用
Mar 05 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
Dec 16 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
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
Chrome Web App开发小结
2014/09/04 PHP
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
JavaScript QueryString解析类代码
2010/01/17 Javascript
用按钮控制iframe显示的网页实现方法
2013/02/04 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
2015/01/22 Javascript
javascript学习小结之prototype
2015/12/03 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
js原生之焦点图转换加定时器实例
2016/12/12 Javascript
easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大的实现代码
2017/01/12 Javascript
jquery 实现复选框的全选操作实例代码
2017/01/24 Javascript
利用Blob进行文件上传的完整步骤
2018/08/02 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
微信小程序map组件结合高德地图API实现wx.chooseLocation功能示例
2019/01/23 Javascript
vue实现计步器功能
2019/11/01 Javascript
微信小程序实现上传多个文件 超过10个
2020/03/30 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
用Python给文本创立向量空间模型的教程
2015/04/23 Python
python字符串对其居中显示的方法
2015/07/11 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
2017/04/28 Python
python中logging包的使用总结
2018/02/28 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
套娃式文件夹如何通过Python批量处理
2020/08/23 Python
Python 用__new__方法实现单例的操作
2020/12/11 Python
html5基础标签(html5视频标签 html5新标签用法)
2013/12/30 HTML / CSS
Mountain Warehouse澳大利亚官网:欧洲家庭户外品牌倡导者
2016/11/20 全球购物
家庭教育先进个人事迹材料
2014/01/24 职场文书
三年级音乐教学反思
2014/01/28 职场文书
高中军训感言400字
2014/02/24 职场文书
安全施工标语
2014/06/07 职场文书
2014年大学生工作总结
2014/11/20 职场文书
队列队形口号
2015/12/25 职场文书
初任公务员培训心得体会
2016/01/08 职场文书
初一英语教学反思
2016/02/15 职场文书
源码安装apache脚本部署过程详解
2022/09/23 Servers