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 cookie的操作实现代码(登录)
Dec 29 PHP
7个超级实用的PHP代码片段
Jul 11 PHP
php调用Google translate_tts api实现代码
Aug 07 PHP
ThinkPHP上使用多说评论插件的方法
Oct 31 PHP
深入讲解PHP的对象注入(Object Injection)
Mar 01 PHP
详解php中serialize()和unserialize()函数
Jul 08 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
Oct 13 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
May 12 PHP
laravel框架使用极光推送消息操作示例
Feb 15 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 PHP
TP5多入口设置实例讲解
Dec 15 PHP
php 原生分页
Apr 01 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制作静态网站的模板框架
2006/10/09 PHP
用PHP实现Ftp用户的在线管理的代码
2007/03/06 PHP
PHP计划任务之关闭浏览器后仍然继续执行的函数
2010/07/22 PHP
献给php初学者(入门学习经验谈)
2010/10/12 PHP
PHP数组相加操作及与array_merge的区别浅析
2016/11/26 PHP
html下载本地
2006/06/19 Javascript
比较详细的javascript对象的property和prototype是什么一种关系
2007/08/06 Javascript
Javascript 面向对象之重载
2010/05/04 Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
用js模拟JQuery的show与hide动画函数代码
2010/09/20 Javascript
js为数字添加逗号并格式化数字的代码
2013/08/23 Javascript
5种处理js跨域问题方法汇总
2014/12/04 Javascript
使用AngularJS实现表单向导的方法
2015/06/19 Javascript
JQuery菜单效果的两个实例讲解(3)
2015/09/17 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
Javascript实现图片懒加载插件的方法
2016/10/20 Javascript
jQuery验证表单格式的使用方法
2017/01/10 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
对VUE中的对象添加属性
2018/09/18 Javascript
javscript 数组扁平化的实现
2020/02/03 Javascript
一个简单的python程序实例(通讯录)
2013/11/29 Python
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
2013/12/04 Python
pytorch中的transforms模块实例详解
2019/12/31 Python
浅谈Python中re.match()和re.search()的使用及区别
2020/04/14 Python
Python爬虫:Request Payload和Form Data的简单区别说明
2020/04/30 Python
阿拉伯世界最大的电子卖场:Souq埃及
2016/08/01 全球购物
美国农场商店:Blain’s Farm & Fleet
2020/01/17 全球购物
华硕新加坡官方网上商店:ASUS Singapore
2020/07/09 全球购物
《小松树和大松树》教学反思
2014/02/20 职场文书
2014庆六一活动方案
2014/03/02 职场文书
学生偷窃检讨书
2014/09/25 职场文书
党员剖析材料范文
2014/09/30 职场文书
入党函调证明材料
2014/12/24 职场文书
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang
JS前端使用canvas实现物体的点选示例
2022/08/05 Javascript