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实现采集程序原理和简单示例代码
Mar 18 PHP
frename PHP 灵活文件命名函数 frename
Sep 09 PHP
php与XML、XSLT、Mysql的结合运用实现代码
Nov 19 PHP
用php实现的下载css文件中的图片的代码
Feb 08 PHP
创建配置文件 用PHP写出自己的BLOG系统 2
Apr 12 PHP
关于PHP模板Smarty的初级使用方法以及心得分享
Jun 21 PHP
php5.3提示Function ereg() is deprecated Error问题解决方法
Nov 12 PHP
PHP+jquery+ajax实现即时聊天功能实例
Dec 23 PHP
PHP判断是否为空的几个函数对比
Apr 21 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
Jul 03 PHP
Thinkphp5 自定义上传文件名的实现方法
Jul 23 PHP
浅谈laravel框架sql中groupBy之后排序的问题
Oct 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
DOTA2 玩家自创拉野攻略 特色英雄快速成长篇
2020/04/20 DOTA
建立动态的WML站点(一)
2006/10/09 PHP
PHP的FTP学习(一)
2006/10/09 PHP
php计算年龄精准到年月日
2015/11/17 PHP
php 伪造HTTP_REFERER页面URL来源的三种方法
2016/09/22 PHP
Yii框架数据模型的验证规则rules()被执行的方法
2016/12/02 PHP
PHP设计模式之工厂模式详解
2017/10/24 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
不安全的常用的js写法
2009/09/15 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
React Router v4 入坑指南(小结)
2018/04/08 Javascript
JS实现二维数组元素的排列组合运算简单示例
2019/01/28 Javascript
详解Vue前端生产环境发布配置实战篇
2019/05/07 Javascript
Vue使用轮询定时发送请求代码
2020/08/10 Javascript
Python中使用PIL库实现图片高斯模糊实例
2015/02/08 Python
Python中对元组和列表按条件进行排序的方法示例
2015/11/10 Python
Python实现代码统计工具(终极篇)
2016/07/04 Python
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
python的Crypto模块实现AES加密实例代码
2018/01/22 Python
Django实现学生管理系统
2019/02/26 Python
python3利用Socket实现通信的方法示例
2019/05/06 Python
python rsync服务器之间文件夹同步脚本
2019/08/29 Python
详解用Python进行时间序列预测的7种方法
2020/03/13 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
Django Channel实时推送与聊天的示例代码
2020/04/30 Python
快速解释如何使用pandas的inplace参数的使用
2020/07/23 Python
HTML5不支持标签和新增标签详解
2016/06/27 HTML / CSS
杭州联环马网络笔试题面试题
2013/08/04 面试题
后勤自我鉴定
2013/10/13 职场文书
科学发展观活动总结
2014/08/28 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
2014年煤矿工作总结
2014/11/24 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书
大学生见习总结报告
2015/06/24 职场文书