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中创建并处理图象
Oct 09 PHP
PHP防注入安全代码
Apr 09 PHP
MySql 按时间段查询数据方法(实例说明)
Nov 02 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
Jul 02 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
Dec 08 PHP
PHP数据库连接mysql与mysqli对比分析
Jan 04 PHP
Fleaphp常见函数功能与用法示例
Nov 15 PHP
浅谈laravel数据库查询返回的数据形式
Oct 21 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
Jan 25 PHP
thinkphp框架表单数组实现图片批量上传功能示例
Apr 04 PHP
PHP 命名空间和自动加载原理与用法实例分析
Apr 29 PHP
PHP实现创建以太坊钱包转账等功能
Apr 21 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用数组返回无限分类的列表数据的代码
2010/08/08 PHP
php压缩和解压缩字符串的方法
2015/03/14 PHP
PHP实现上一篇下一篇的方法实例总结
2016/09/22 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
JS实现的5级联动Select下拉选择框实例
2015/08/17 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
2016/07/28 Javascript
Vue.js每天必学之内部响应式原理探究
2016/09/07 Javascript
jQuery中show与hide方法用法示例
2016/09/16 Javascript
Javascript 普通函数和构造函数的区别
2016/11/05 Javascript
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
vue 下列表侧滑操作实例代码详解
2018/07/24 Javascript
vue 兄弟组件的信息传递的方法实例详解
2019/08/30 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
python读取指定字节长度的文本方法
2019/08/27 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
Django配置Bootstrap, js实现过程详解
2020/10/13 Python
HTML5+css3:3D旋转木马效果相册
2017/01/03 HTML / CSS
HTML5 input新增type属性color颜色拾取器的实例代码
2018/08/27 HTML / CSS
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
马来西亚时装购物网站:ZALORA马来西亚
2017/03/14 全球购物
数百万免费的图形资源:Freepik
2020/09/21 全球购物
开工仪式主持词
2014/03/20 职场文书
家长寄语大全
2014/04/02 职场文书
班主任新年寄语
2014/04/04 职场文书
法人代表授权委托书
2014/04/08 职场文书
农业开发项目建议书
2014/05/16 职场文书
项目合作协议书
2014/09/23 职场文书
租房协议书范例
2014/10/14 职场文书
三提三创主题教育活动查摆整改措施
2014/10/25 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书
高中物理教学反思
2016/02/19 职场文书
Python进行区间取值案例讲解
2021/08/02 Python
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏
mysql序号rownum行号实现方式
2022/12/24 MySQL