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 和 MySQL 基础教程(一)
Oct 09 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
Sep 11 PHP
如何用php生成扭曲及旋转的验证码图片
Jun 07 PHP
php无限极分类递归排序实现方法
Nov 11 PHP
php示例详解Constructor Prototype Pattern 原型模式
Oct 15 PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
Nov 10 PHP
php生成高清缩略图实例详解
Dec 07 PHP
解析PHP之提取多维数组指定列的方法
Jan 03 PHP
PHP处理bmp格式图片的方法分析
Jul 04 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
PHP实现SMTP邮件的发送实例
Sep 27 PHP
PHP xpath()函数讲解
Feb 11 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实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
PHP QRCODE生成彩色二维码的方法
2016/05/19 PHP
php readfile下载大文件失败的解决方法
2017/05/22 PHP
js Date自定义函数 延迟脚本执行
2010/03/10 Javascript
jQuery JSON的解析方式分享
2011/04/05 Javascript
JS弹出窗口代码大全(详细整理)
2012/12/21 Javascript
ajax中get和post的说明及使用与区别
2012/12/23 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
Js中的onblur和onfocus事件应用介绍
2013/08/27 Javascript
jQuery瀑布流插件Wookmark使用实例
2014/04/02 Javascript
浏览器兼容的JS写法总结
2016/04/27 Javascript
浅析Bootstrip的select控件绑定数据的问题
2016/05/10 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
AngularJS实现的输入框字数限制提醒功能示例
2017/10/26 Javascript
解决bootstrap-select 动态加载数据不显示的问题
2018/08/10 Javascript
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
2019/03/19 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
vue项目里面引用svg文件并给svg里面的元素赋值
2020/08/17 Javascript
微信小程序组件生命周期的踩坑记录
2021/03/03 Javascript
[10:18]2018DOTA2国际邀请赛寻真——找回自信的TNCPredator
2018/08/13 DOTA
在Python中使用NLTK库实现对词干的提取的教程
2015/04/08 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
2018/03/19 Python
Python 实现王者荣耀中的敏感词过滤示例
2019/01/21 Python
Numpy(Pandas)删除全为零的列的方法
2020/09/11 Python
Lou & Grey美国官网:主打舒适性面料服饰
2017/12/21 全球购物
日本最大的旅游网站:Rakuten Travel(乐天旅游)
2018/08/02 全球购物
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
办理暂住证介绍信
2014/01/11 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
2014年团员学习十八大思想汇报
2014/09/13 职场文书
党的群众路线教育实践活动个人整改方案
2014/10/25 职场文书
普通员工辞职信范文
2015/05/12 职场文书
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP
MySQL 条件查询的常用操作
2022/04/28 MySQL
基于redis+lua进行限流的方法
2022/07/23 Redis
python语言中pandas字符串分割str.split()函数
2022/08/05 Python